2013-04-08 25 views
0

我想要使用BitmapShader在畫布上繪製。我有兩個尺寸相同的圖像(一個用於阿爾法通道,另一個用於RGB),我想在用相同尺寸創建的畫布上繪製。問題是,它看起來好像canvas.drawBitmap用戶絕對座標爲油漆。有沒有一種方法可以繪製相對座標。當使用canvas.drawBitmap時使用相對座標應用BitmapShader

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,但不考慮動畫。

我試着通過在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與相同的paint將使用相對座標。所以用下面的替代方法抽籤將正確渲染上繪製的RGB圖像(而非掩模)

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

回答

0

看來,這是一個硬件加速的問題。禁用視圖上的HW加速將着色器移回相對座標。

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

disableHwAcceleration不是一種方法。這可以通過代碼'View.setLayerType(LAYER_TYPE_SOFTWARE,null);' – Jona 2016-12-14 21:18:55

相關問題