画图有三种方法:
【1】在界面上放置一个ImageView控件,利用监听器完成绘图
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//关联布局文件
setContentView(R.layout.activity_main);
//通过id找到这个组件,然后在它上面设置监听器(虚拟机监听鼠标的点击)
imageView = (ImageView)this.findViewById(R.id.imageView);
imageView.setOnTouchListener(onTouchListener);
//新建一个画图对象,可以去掉最前面的需要点击的View
Bitmap bitmap2 = Bitmap.createBitmap(1,1,Config.ARGB_8888);;
imageView.setImageBitmap(bitmap2);
}
绘图的三个工具:
Bitmap:位图,我的理解是可以看成图片或者说是像素显示对象
Canvas:画布,你可以在上面画自己想画的东西,使用时与Bitmap相关联
paint:画图用的工具,对字体颜色样式的修改要通过这个
接下来只需要在监听器的方法中指明如何画图即可,例如(要注意画图区域大小的获取):
if(bitmap ==null){
//画图区域的大小在这里获取
bitmap = Bitmap.createBitmap(imageView.getWidth(),imageView.getHeight(),Config.ARGB_8888);
//把画图工具与bitmap关联
canvas = new Canvas(bitmap);
}
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN){
x1 = event.getX();
y1 = event.getY();
oldX = x1;
oldY = y1;
}else if(action == MotionEvent.ACTION_UP){
x2 = event.getX();
y2 = event.getY();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(5.0f);
canvas.drawCircle(x2, y2, Math.abs(x1-x2), paint);
//把内存图片装载到相框中
imageView.setImageBitmap(bitmap);
【2】继承View类完成绘图
重写View中的三个构造方法,在onDraw方法中重写来实现画图
public void onDraw(Canvas c){
for(int i=0;i<list.size();i++){
Entity e = list.get(i);
e.draw(c);
e.move();
}
并且利用Android提供的invalidate方法进行刷新,为了实现不断刷新,所以需要写一个线程run方法来实现 重绘,但是在这里并不能在方法里面访问界面上的组件进行刷新,所以用到Handler与callbakck,通过回调 实现
handler = new Handler(callback);
private Callback callback = new Callback(){
@Override
public boolean handleMessage(Message msg) {
invalidate();
return true;
}
};
【3】继承SurfaceView类完成绘图
重写SurfaceView的三个构造方法,利用Holder对象来实现消息回调并且锁定画布对象
public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
list.add(new Ball(this));
holder = this.getHolder();
holder.addCallback(this);
}
同样的在线程中画图,画图之前锁定画布对象,最后释放,在Surface创建时启动线程,销毁时结束线程
public void surfaceCreated(SurfaceHolder holder) {
//surface创建时启动线程
Thread t = new Thread(this);
t.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
runflag = false;
}
public void run() {
while(runflag){
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
Canvas canvas = null;
try {
Thread.sleep(40);
//获得SurfaceView上的画布对象,并且锁定
canvas = holder.lockCanvas();
//拿矩形盖掉之前画的图片
canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
//画图......
for(int i=0;i<list.size();i++){
Entity entity = list.get(i);
entity.draw(canvas);
entity.move();
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
//画布对象使用完成后,必须要释放
holder.unlockCanvasAndPost(canvas);
}
}
}