一、Canvas和Paint基础
Canvas和Paint是Android自定义View中最为基础的两个类。Canvas类表示一个绘图面,可以在其上面执行各种绘制操作。Paint类则表示绘制的笔刷,可以设置其粗细、颜色、线条样式等。因此,我们在自定义View时需要了解Canvas和Paint的基础使用方法。
首先,在自定义View的onDraw()方法中创建一个Canvas对象,并用Paint对象设置绘图选项。接着,通过Canvas的绘制方法绘制我们希望看到的图形。最后,将绘制好的图形显示在屏幕上。
public class MyView extends View {
private Paint mPaint; // 画笔
private Canvas mCanvas; // 画布
public MyView(Context context) {
super(context);
mPaint = new Paint();
mCanvas = new Canvas();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.RED); // 设置画笔颜色
mPaint.setStrokeWidth(5); // 设置画笔宽度
// 在画布上绘制圆形
mCanvas.drawCircle(100, 100, 50, mPaint);
// 将画布显示在屏幕上
canvas.drawBitmap(mCanvasBitmap, 0, 0, null);
}
}
二、自定义形状绘制
在Android自定义View中,我们可以通过Canvas和Paint类实现各种自定义形状的绘制。例如线条、矩形、圆形、椭圆以及各种不规则图形等等。
下面以绘制一个扇形为例,展示具体的实现过程:
public class ArcView extends View {
private Paint mPaint; // 画笔
private RectF mRectF; // 矩形
private int mWidth, mHeight; // 控件宽高
public ArcView(Context context) {
super(context);
mPaint = new Paint();
mRectF = new RectF();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
mRectF.set(0, 0, mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.RED); // 设置画笔颜色
mPaint.setStyle(Paint.Style.FILL); // 设置画笔样式为实心
canvas.drawArc(mRectF, -45, 90, true, mPaint); // 绘制扇形
}
}
三、高级特效实现
使用Canvas和Paint结合其他的特效类库,能够产生一些非常精美的UI效果。例如水波纹效果、模糊效果、圆角矩形等等。
现在以绘制一个带水波纹的圆形按钮为例:
public class RippleButtonView extends View {
private Paint mPaint; // 画笔
private Bitmap mBitmap; // Bitmap
private BitmapShader mBitmapShader; // BitmapShader
private int mRadius; // 圆的半径
private Shader mShader; // 渲染器
private PorterDuffXfermode mPorterDuffXfermode; // 混合模式
public RippleButtonView(Context context) {
super(context);
mPaint = new Paint();
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setShader(mShader);
canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
mPaint.setShader(null);
mPaint.setXfermode(mPorterDuffXfermode);
canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
mPaint.setXfermode(null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
createShader();
break;
case MotionEvent.ACTION_UP:
mShader = null;
break;
}
return true;
}
private void createShader() {
mShader = new RadialGradient(mRadius, mRadius, mRadius,
new int[]{Color.TRANSPARENT, Color.parseColor("#66FFFFFF")},
null, Shader.TileMode.CLAMP);
mPaint.setShader(mShader);
invalidate();
}
}
以上是Android自定义View使用Canvas和Paint实现精美UI效果的核心内容,通过学习这些基础并实践,我们可以创造出更丰富独特的自定义View。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/152545.html
微信扫一扫
支付宝扫一扫