如何在启用了抗锯齿的情况下旋转drawable

emm*_*mby 8 android image rotation imageview

我需要将ImageView旋转几度.我是通过继承ImageView和重载来做到这一点的onDraw()

@Override
protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.scale(0.92f,0.92f);
    canvas.translate(14, 0);
    canvas.rotate(1,0,0);
    super.onDraw(canvas);
    canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)

问题是结果的图像显示了一堆锯齿.

http://img.skitch.com/20100608-gmdy4sexsm1c71di9rgiktdjhu.png

为了消除锯齿,我怎样才能对需要旋转的ImageView进行抗锯齿处理?有一个更好的方法吗?

emm*_*mby 5

如果您知道Drawable是BitmapDrawable,则可以在位图的Paint中使用消除锯齿来执行以下操作:

/**
 * Not as full featured as ImageView.onDraw().  Does not handle 
 * drawables other than BitmapDrawable, crop to padding, or other adjustments.
 */
@Override
protected void onDraw(Canvas canvas) {
    final Drawable d = getDrawable();

    if( d!=null && d instanceof BitmapDrawable && ((BitmapDrawable)d).getBitmap()!=null ) {
        final Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
        final int paddingLeft = getPaddingLeft();
        final int paddingTop = getPaddingTop();

        canvas.save();

        // do my rotation and other adjustments
        canvas.scale(0.92f,0.92f);
        canvas.rotate(1,0,0);

        if( paddingLeft!=0 )
            canvas.translate(paddingLeft,0);

        if( paddingTop!=0 )
            canvas.translate(0,paddingTop);

        canvas.drawBitmap( ((BitmapDrawable)d).getBitmap(),0,0,p );
        canvas.restore();
    }
}
Run Code Online (Sandbox Code Playgroud)


Pri*_*990 5

将 antialias 和 filterBitmap 设置为绘制位图的颜料。我有一个类似的问题,这对我有用:

Paint bitmapPaint = new Paint();
bitmapPaint.setAntiAlias(true);
bitmapPaint.setFilterBitmap(true);
Run Code Online (Sandbox Code Playgroud)