如何在启用抗锯齿的情况下旋转可绘制对象 [英] How to rotate a drawable with anti-aliasing enabled

查看:35
本文介绍了如何在启用抗锯齿的情况下旋转可绘制对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将 ImageView 旋转几度.我通过继承 ImageView 和重载 onDraw()

I need to rotate an ImageView by a few degrees. I'm doing this by subclassing ImageView and overloading 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();
}

问题是生成的图像显示了一堆锯齿.

The problem is that the image that results shows a bunch of jaggies.

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

如何对需要旋转的 ImageView 进行抗锯齿处理以消除锯齿?有没有更好的方法来做到这一点?

How can I antialias an ImageView that I need to rotate in order to eliminate jaggies? Is there a better way to do this?

推荐答案

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

If you know that your Drawable is a BitmapDrawable, you can use anti-aliasing in the bitmap's Paint to do something like the following:

/**
 * 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();
    }
}

这篇关于如何在启用抗锯齿的情况下旋转可绘制对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆