画图有三种方法:
【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类完成绘图
扫描二维码关注公众号,回复:
1164729 查看本文章
重写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); } } }