2013-04-08 2 views
0

Я пытаюсь использовать BitmapShader для рисования на холсте. У меня есть 2 изображения одинаковых размеров (один для канала альфа и один для RGB), который я хочу рисовать на холсте, который был создан с тем же размером. Проблема в том, что кажется, что canvas.drawBitmap пользователи абсолютных координат для краски. есть способ рисовать с относительными координатами.Применение BitmapShader с использованием относительных координат при использовании canvas.drawBitmap

public class MaskedImageDrawable extends Drawable { 
    private final Bitmap mMask; 

    private final Paint mPaint = new Paint(); 

    public MaskedImageDrawable(Bitmap mask, Bitmap image) { 
     mMask = mask; 

     Shader targetShader = 
      new BitmapShader(image, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
     mPaint.setShader(targetShader); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     canvas.drawBitmap(mMask, 0.0f, 0.0f, mPaint); 
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.TRANSLUCENT; 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     mPaint.setAlpha(alpha); 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
     mPaint.setColorFilter(cf); 
    } 
} 

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

Я попытался применить относительные координаты, применив перевод на шейдере в onBoundsChange, но координаты здесь также являются относительными.

Matrix mTranslationMatrix = new Matrix() 

    @Override 
    protected void onBoundsChange(Rect bounds) { 
     super.onBoundsChange(bounds); 
     mTranslationMatrix.setTranslate(bounds.left, bounds.top); 
     mPaint.getShader().setLocalMatrix(mTranslationMatrix); 
    } 

В качестве справки - кажется, что drawRect с той же краской будет использовать относительные координаты. поэтому замена метода рисования со следующим будет сделать изображение RGB на Drawable правильно (но не маска)

@Override 
public void draw(Canvas canvas) { 
    // getBounds returns the relative coordinates as well 
    canvas.drawRect(getBounds, mPaint); 
} 

ответ

0

кажется, что это проблема ускорения HW. отключение ускорения HW в представлении переводит шейдер обратно в относительные координаты.

if (android.os.Build.VERSION.SDK_INT >= 11) { 
    myView.disableHwAcceleration(); 
} 
+0

disableHwAcceleration - это не метод. Это было бы способом сделать это с помощью кода 'View.setLayerType (LAYER_TYPE_SOFTWARE, null);' – Jona

Смежные вопросы