本章只关注绘制虚线,不关注Canvas的其它操作。
Android中,Canvas的功能都非常强大,一般情况下,用到了就去研究,用不到就懒得理会它。但是随着项目的需求不断增加,再怎么不想了解Canvas,也会或多或少的和这玩意儿接触。
例如在Android中,如果自定义的控件需要使用虚线该怎么完成呢。
1、 可以使用美工,让美工进行切图
2、 可以自己使用画笔进行绘制
现在提供这两种方式的操作:
package com.example.aaaaa;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
/** 中央分割线的绘制 **/
private Paint linePaint;
private Paint strockpaint;
private Paint p;
private Bitmap decodeResource;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
linePaint = new Paint();
linePaint.setAntiAlias(true);
// linePaint.setColor(Color.parseColor("#aeaeae"));
linePaint.setColor(Color.RED);
linePaint.setStrokeWidth(2f);
linePaint.setTextSize(25);
linePaint.setStrokeJoin(Paint.Join.ROUND);
strockpaint = new Paint();
strockpaint.setAntiAlias(true);
strockpaint.setStyle(Paint.Style.STROKE);
strockpaint.setColor(Color.BLUE);
DashPathEffect effects = new DashPathEffect(new float[]{5,5,5,5},1);
strockpaint.setPathEffect(effects);
p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setStyle(Style.STROKE);
p.setColor(Color.RED);
p.setStrokeWidth(1);
p.setTextSize(30);
p.setStrokeWidth(10);
DashPathEffect effects1 = new DashPathEffect(new float[] { 1, 4, 7, 8}, 1);
p.setPathEffect(effects1);
decodeResource = BitmapFactory.decodeResource(getResources(),R.drawable.seat_center_line);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(100, 0, 600, 1000, linePaint);
canvas.drawCircle(202, 202, 100, strockpaint);
canvas.drawLine(0, 0, 400, 400, strockpaint);
canvas.drawRect(20, 100, 21, 450, strockpaint);
canvas.drawText("绘制红色的虚线", 210, 300, linePaint);
canvas.drawLine(200, 140, 500, 40, p);
//绘制红色的虚线
Path path = new Path();
path.moveTo(200, 300);
path.lineTo(300, 1600);
<span style="color:#009900;">//关注:①使用Canvas绘制虚线</span>
canvas.drawPath(path , p);
<span style="color:#009900;">//关注:②使用Canvas绘制虚线Bitmap--图片是虚线的</span>
canvas.drawBitmap(createRepeaterY(1000, decodeResource), 300, 300, null);
}
//绘制重复bitmap的图片
public Bitmap createRepeaterY(int height, Bitmap src){
int count = (height + src.getHeight() - 1) / src.getHeight();
Bitmap bitmap = Bitmap.createBitmap(src.getWidth(), height, Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
for(int idx = 0; idx < count; ++ idx){
canvas.drawBitmap(src, 0, idx * src.getHeight(), null);
}
return bitmap;
}
}
效果图如下:
当然也可是使用drawRect达到虚线的效果,但是如果一个控件要求有缩放的功能,那么drawRect绘制的虚线会在所放的时候连接到一块,变成了波浪线。
项目中用到的图片: