一、用到的控件
ImageView:相当于一种图片容器,可以加载各种图标
Bitmap:位图,一种处理图片的类
Canvas:画布
Paint:画笔
我理解的绘画整个过程为画笔在画布上作画,再将画布画在Bitmap上,最后利用ImageView加载出图片。
二、实现步骤
1.添加控件ImageView
控件添加方法在笔者上一篇文章中有提及,此处不再赘述
2.创建Bitmap
Bitmap的构造方法是私有的,所以不能利用new来创建。创建方法如下: Bitmap map=Bitmap.creatBitmap(width,height,Config config)。第三个参数为枚举类型,定义了位图的4种格式。分别为:
ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图
ARGB_8888 代表32位ARGB位图
RGB_565 代表8位RGB位图
位图位数越高代表可以存储的颜色信息越多,即图片越逼真。
此处需注意宽度和高度不可直接利用ImageView获取其宽度和高度。因为ImageView在主线程运行到创建Biamap时还未加载好,容易出错。若想在整个屏幕区域绘图可获取手机的宽度和高度,方法如下:
DisplayMetrics metrics=new DisplayMetrics;
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width=metrics.widthPixels;
int height=metrics.heightPixels;
3.创建画布
Canvas c=new Canvas(Bitmap map);
4.创建画笔
Paint p=new Paint();
5.在ImageView上添加触摸监听OntouchListener
三、代码实现
下面代码可画渐变色曲线
主线程
public class MainActivity extends Activity {
private ImageView iv;
private Bitmap map;
private Canvas c;
private Paint p;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
DisplayMetrics m=new DisplayMetrics();
//获取ImageView
iv = (ImageView) findViewById(R.id.imageView1);
getWindowManager().getDefaultDisplay().getMetrics(m);
//创建位图
map=Bitmap.createBitmap(m.widthPixels,m.heightPixels,Bitmap.Config.ARGB_8888);
//获取画布
c=new Canvas(map);
//设置画布颜色
// c.drawColor(Color.RED);
//获取画笔
p=new Paint();
//设置画笔颜色
// p.setColor(Color.RED);
//设置画笔粗细
p.setStrokeWidth(10);
//把背景画上
c.drawBitmap(map, new Matrix(), p);
//加监听
iv.setOnTouchListener(new Listener(iv, map, c, p));
}
监听类
public class Listener implements OnTouchListener {
private ImageView iv;
private Bitmap map;
private Canvas c;
private Paint p;
private float sx,sy,ex,ey;
public Listener(ImageView iv, Bitmap map, Canvas c,Paint p) {
super();
this.iv = iv;
this.map = map;
this.c = c;
this.p=p;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//获取按下时坐标
sx=event.getX();
sy=event.getY();
break;
case MotionEvent.ACTION_MOVE:
//获取移动时坐标
ex=event.getX();
ey=event.getY();
p.setColor(Color.rgb((int)sx, (int)sy, (int)ey));
//画直线
c.drawLine(sx, sy, ex, ey, p);
//交换坐标
sx=ex;
sy=ey;
//加载画好的图片
iv.setImageBitmap(map);
break;
}
return true;
}
}