私はまだ数日前から抱えていた問題を解決しようとしていますが、まだ解決策が見つかりません。しかし、私は段階的にそこに到達しています。今、私は別の障害に遭遇しました。
Bitmap.getpixel(int x, int y)
を取得して、ユーザーがColor
を使用して触れたもののOnTouchListener
を返そうとしています。パイはVectorDrawable
リソース、vectordrawable.xml
まだピクセルデータに対して何もする必要はなく、テストするだけです。そこで、触れたTextView
を吐き出すColor
を作成しました。
public class MainActivity extends AppCompatActivity {
ImageView imageView;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
textView = (TextView) findViewById(R.id.textView);
imageView.setOnTouchListener(imageViewOnTouchListener);
}
View.OnTouchListener imageViewOnTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
Drawable drawable = ((ImageView)view).getDrawable();
//Bitmap bitmap = BitmapFactory.decodeResource(imageView.getResources(),R.drawable.vectordrawable);
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
int x = (int)event.getX();
int y = (int)event.getY();
int pixel = bitmap.getPixel(x,y);
textView.setText("touched color: " + "#" + Integer.toHexString(pixel));
return true;
}
};
}
しかし、ImageView
に触れるとすぐに、アプリで致命的なエラーが発生し、「残念ながら...」というメッセージが表示されて終了します。スタックトレースで、これを見つけました。
Java.lang.ClassCastException: Android.graphics.drawable.VectorDrawable cannot be cast to Android.graphics.drawable.BitmapDrawable
at com.skwear.colorthesaurus.MainActivity$1.onTouch(MainActivity.Java:38)
38行目はこれです。
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
私はちょっとフォローしました this 。私は何が間違っているのですか? VectorDrawable
だからですか。 Color
を取得するにはどうすればよいですか? BitmapFactory
をキャストするためにDrawable
も試したことがわかります。 API 21のように追加されたため、APIレベルVectorDrawable
にも問題がありますか?
まず、VectorDrawable
をBitmapDrawable
にキャストすることはできません。彼らは親子関係を持っていません。どちらもDrawable
クラスの直接のサブクラスです。
ここで、ドローアブルからビットマップを取得するには、ドローアブルメタデータからBitmap
を作成する必要があります。
おそらく別の方法でこのようなもの、
try {
Bitmap bitmap;
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
} catch (OutOfMemoryError e) {
// Handle the error
return null;
}
これがお役に立てば幸いです。
AndroidXサポートライブラリの Drawable.toBitmap()
を使用します。 VectorDrawable
はDrawable
の子です。