Размытое растровое изображение Vectordrawable на ImageView

Я создал собственное представление, которое расширяет ImageView. Когда я устанавливаю векторный рисунок, область просмотра которого меньше, я замечаю, что изображение размыто. Если я просто использую ImageView, я вижу, что векторное изображение резкое, как и должно быть.

В моем пользовательском представлении я переопределяю «setImageDrawable», где я вызываю super, а затем получаю растровое изображение из drawable для рисования позже в onDraw.

Вот как я конвертирую в растровое изображение

public Bitmap getBitmapFromDrawable(Drawable drawable) {
         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;
}



Ответы (2)


Вам нужно получить ширину и высоту представления, а не рисовать, и использовать их в качестве границ для рисования. Я предполагаю, что размер вашего представления может меняться со временем, поэтому это не разовая задача. Я бы сохранил рисование в поле члена:

   private Drawable drawable;

   @Override
   public void setImageDrawable(Drawable drawable) {
       this.drawable = drawable;
       this.drawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
       // invalidate if needed
   }

   @Override
   protected void onMeasure(int wms, int hms) {
       super.onMeasure(wms, hms);
       if (drawable != null) drawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
   }

Затем onDraw просто нарисуйте рисуемый объект.

person natario    schedule 16.04.2017

Просто сделайте drawable.getIntrinsicWidth()*5(любое число), drawable.getIntrinsicHeight()*5 и передайте DisplayMatrices в первом параметре, это повысит качество.


public Bitmap getBitmapFromDrawable(Drawable drawable) {
    Bitmap bitmap = Bitmap.createBitmap(context.getResources().getDisplayMetrics(), drawable.getIntrinsicWidth()*5,
            drawable.getIntrinsicHeight()*5,
            Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}
person Vivek Yadav    schedule 18.04.2020