Как получить растровое изображение из VectorDrawable

пирог

Я все еще пытаюсь решить проблему, которая у меня была с тех пор, как пару дней назад, и я до сих пор не нашел решения. Тем не менее, я добираюсь туда шаг за шагом. Теперь я столкнулся с другим препятствием.

Я пытаюсь получить Bitmap.getpixel(int x, int y) чтобы вернуть Color того, что пользователь коснулся, используя OnTouchListener . vectordrawable.xml – ресурс 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(); 

Я как бы следовал за этим . Что я делаю не так? Это потому, что это VectorDrawable . Что я могу сделать, чтобы получить Color ? Вы можете видеть, что я также попробовал BitmapFactory для создания Drawable . Может ли это быть проблемой с уровнем API VectorDrawable поскольку он был добавлен как API 21?

Прежде всего, вы не можете использовать VectorDrawable для BitmapDrawable . У них нет отношений между родителями и детьми. Они оба являются прямыми подклассами класса Drawable .

Теперь, чтобы получить растровое изображение с возможностью рисования, вам нужно будет создать Bitmap из доступных метаданных.

Вероятно, что-то вроде этого в отдельном методе,

 try { Bitmap bitmap; bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); 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; } 

Надеюсь, это поможет.