绘制圆角

本文介绍了Android中Canvas的save和restore方法的用途,以及如何通过它们来控制图形绘制。同时,文章探讨了防止图形锯齿的两种情况:位图绘制时的锯齿和RotateAnimation动画中的锯齿,并提供了相应的解决方案,包括设置Paint属性和使用PaintFlagsDrawFilter。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入一点内容

Canvas的save和restore

onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。

在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?

❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。

❑ restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。

save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。save和restore之间,往往夹杂的是对Canvas的特殊操作。

例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:

int px = getMeasuredWidth();

int py = getMeasuredWidth();

// Draw background

canvas.drawRect(0, 0, px, py, backgroundPaint);

canvas.save();

canvas.rotate(90, px/2, py/2);

// Draw up arrow

canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);

canvas.drawLine(px / 2, 0, px, py / 2, linePaint);

canvas.drawLine(px / 2, 0, px / 2, py, linePaint);

canvas.restore();

// Draw circle

canvas.drawCircle(px - 10, py - 10, 10, linePaint);

效果如图1所示:


如果我们不调用save和restore会是什么样子呢?如图2所示:


从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。 


再插入一点防锯齿的

   在Android中,目前,我知道有两种出现锯齿的情况。

① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿。

② 在用View的RotateAnimation做动画时候,如果View当中包含有大量的图形,也会出现锯齿。我们分别以这两种情况加以考虑。

◆ 用Canvas绘制位的的情况。在用Canvas绘制位图时,一般地,我们使用drawBitmap函数家族,在这些函数中,都有一个Paint参数,要做到防止锯齿,我们就要使用到这个参数。如下:首先在你的构造函数中,需要创建一个Paint。

Paint mPaint = new Paint();

然后,您需要设置两个参数:

1)mPaint.setAntiAlias(); 2)mPaint.setBitmapFilter(true)。第一个函数是用来防止边缘的锯齿,第二个函数是用来对位图进行滤波处理。最后,在画图的时候,调用drawBitmap函数,只需要将整个Paint传入即可。

◆ 有时候,当你做RotateAnimation时,你会发现,讨厌的锯齿又出现了。这个时候,由于你不能控制位图的绘制,只能用其他方法来实现防止锯齿。另外,如果你画的位图很多。不想每个位图的绘制都传入一个Paint。还有的时候,你不可能控制每个窗口的绘制的时候,您就需要用下面的方法来处理——对整个Canvas进行处理。

1)在您的构造函数中,创建一个Paint滤波器。

PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);第一个参数是你要清除的标志位,第二个参数是你要设置的标志位。此处设置为对位图进行滤波。

2)当你在画图的时候,如果是View则在onDraw当中,如果是ViewGroup则在dispatchDraw中调用如下函数。

canvas.setDrawFilter( mSetfil );

★ 最后,另外,在Drawable类及其子类中,也有函数setFilterBitmap可以用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果。

转载地址: http://blog.youkuaiyun.com/yangpeng98/article/details/5642834


绘圆角,参考http://rssbook.blogbus.com/logs/112860509.html

1.配置文件实现
<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:drawable="@drawable/icon_home_button_img"/> 
<item android:drawable="@drawable/icon_home_shape_overlay"/> </layer-list> 
icon_home_shape_overlay如下
<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#60000000"/> 
<stroke android:width="3dp" color="#ff000000"/> 
<corners android:radius="10dp" /> 
</shape> 
或者直接使用一种效果
<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#99FFFFFF"/> 
<corners android:radius="30px"/> 
<padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /> 
</shape>
然后 android:background="@drawable/my_shape_file" 


2.图片本身加上圆角
Bitmap myCoolBitmap = ... ; // <-- Your bitmap you want rounded 
int w = myCoolBitmap.getWidth(), h = myCoolBitmap.getHeight(); 

Bitmap rounder = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(rounder);   

Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
xferPaint.setColor(Color.RED); 

canvas.drawRoundRect(new RectF(0,0,w,h), 20.0f, 20.0f, xferPaint); 

xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
canvas.drawBitmap(myCoolBitmap, 0,0, null); 
canvas.drawBitmap(rounder, 0, 0, xferPaint); 
或者
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
        bitmap.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
    final float roundPx = 12;

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);

    return output;
}




http://hi.baidu.com/relayon/blog/item/ad7306dbce19506ad1164ecc.html




Android开发中,我们可以使用drawable来绘制圆角。Drawable是Android中用于绘制图形和颜色的对象。要绘制圆角,我们可以使用ShapeDrawable和RoundRectShape来创建一个圆角矩形。 首先,我们需要在res目录下创建一个名为"rounded_corner.xml"的drawable文件。在这个文件中,我们可以使用<shape>标签来定义一个圆角矩形的形状。其中,我们可以通过<corners>标签来设置圆角的半径。 以下是一个示例的"rounded_corner.xml"文件的内容: ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="20dp" /> <solid android:color="#FF0000" /> </shape> ``` 在这个示例中,我们将圆角的半径设置为20dp,并将填充颜色设置为红色。 接下来,我们可以在布局文件中使用这个drawable。例如,如果我们要将圆角矩形用作按钮的背景,我们可以这样使用: ```xml <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:background="@drawable/rounded_corner" /> ``` 通过将"rounded_corner"设置为按钮的背景,我们可以看到按钮的背景被绘制圆角矩形。 总而言之,通过使用drawable和ShapeDrawable,我们可以轻松地绘制圆角矩形。只需创建一个名为"rounded_corner.xml"的drawable文件,使用<corners>标签来设置圆角的半径,并在布局文件中使用这个drawable作为背景,即可实现圆角效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值