Android画图

画图有三种方法:

【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);
				}
			}
		}

猜你喜欢

转载自463879632.iteye.com/blog/2099355