职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 383|回复: 1

Android 画板

[复制链接]
天上智喜 发表于 2011-8-29 09:43 | 显示全部楼层 |阅读模式
   
import android.app.Activity;   
import android.content.Context;   
import android.graphics.Bitmap;   
import android.graphics.Bitmap.Config;   
import android.graphics.Canvas;   
import android.graphics.Color;   
import android.graphics.Paint;   
import android.graphics.Path;   
import android.os.Bundle;   
import android.view.Display;   
import android.view.MotionEvent;   
import android.view.View;   
import android.view.ViewGroup.LayoutParams;   
import android.view.WindowManager;   
  
/**  
* 用双缓冲实现画板。 缺点:onTouchEvent的时候不能实时显示所画的轨迹,要用户手离开屏幕时候才画出来  
*/  
public class Tuya_demoActivity extends Activity {   
    private MyView myView;   
    private int screenWidth;   
    private int screenHeight;   
  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
  
        WindowManager windowManager = getWindowManager();   
        Display display = windowManager.getDefaultDisplay();   
        screenWidth = display.getWidth();   
        screenHeight = display.getHeight();   
  
        LayoutParams params = new LayoutParams(screenWidth, screenHeight);   
        myView = new MyView(this);   
        this.addContentView(myView, params);   
    }   
  
    public class MyView extends View {   
        private Bitmap cacheMap;   
        private Canvas cacheCanvas;   
        private Path path;   
        private Paint paint;   
        private float preX;   
        private float preY;   
  
        public MyView(Context context) {   
            super(context);   
            this.cacheMap = Bitmap.createBitmap(screenWidth, screenHeight,   
                    Config.ARGB_8888);   
            this.cacheCanvas = new Canvas();   
            this.cacheCanvas.setBitmap(cacheMap);   
            this.cacheCanvas.drawColor(Color.WHITE);   
            this.path = new Path();   
            this.paint = new Paint(Paint.DITHER_FLAG);   
            this.paint.setAntiAlias(true);   
            this.paint.setColor(Color.RED);   
            this.paint.setStyle(Paint.Style.STROKE);   
            this.paint.setStrokeWidth(3);   
        }   
  
        @Override  
        public void onDraw(Canvas canvas) {   
            super.onDraw(canvas);   
            canvas.drawBitmap(cacheMap, 0, 0, new Paint());   
        }   
  
        @Override  
        public boolean onTouchEvent(MotionEvent event) {   
            float x = event.getX();   
            float y = event.getY();   
            System.out.println(x + "  " + y);   
            switch (event.getAction()) {   
            case MotionEvent.ACTION_DOWN:   
                this.preX = x;   
                this.preY = y;   
                path.moveTo(x, y);   
                break;   
            case MotionEvent.ACTION_MOVE:   
                path.quadTo(preX, preY, x, y);   
                this.preX = x;   
                this.preY = y;   
                break;   
            case MotionEvent.ACTION_UP:   
                this.cacheCanvas.drawPath(path, paint);   
                path.reset();   
                break;   
            default:   
                break;   
            }   
            this.invalidate();   
            return true;   
        }   
  
    }   
}  

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;

/**
* 用双缓冲实现画板。 缺点:onTouchEvent的时候不能实时显示所画的轨迹,要用户手离开屏幕时候才画出来
*/
public class Tuya_demoActivity extends Activity {
        private MyView myView;
        private int screenWidth;
        private int screenHeight;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                WindowManager windowManager = getWindowManager();
                Display display = windowManager.getDefaultDisplay();
                screenWidth = display.getWidth();
                screenHeight = display.getHeight();

                LayoutParams params = new LayoutParams(screenWidth, screenHeight);
                myView = new MyView(this);
                this.addContentView(myView, params);
        }

        public class MyView extends View {
                private Bitmap cacheMap;
                private Canvas cacheCanvas;
                private Path path;
                private Paint paint;
                private float preX;
                private float preY;

                public MyView(Context context) {
                        super(context);
                        this.cacheMap = Bitmap.createBitmap(screenWidth, screenHeight,
                                        Config.ARGB_8888);
                        this.cacheCanvas = new Canvas();
                        this.cacheCanvas.setBitmap(cacheMap);
                        this.cacheCanvas.drawColor(Color.WHITE);
                        this.path = new Path();
                        this.paint = new Paint(Paint.DITHER_FLAG);
                        this.paint.setAntiAlias(true);
                        this.paint.setColor(Color.RED);
                        this.paint.setStyle(Paint.Style.STROKE);
                        this.paint.setStrokeWidth(3);
                }

                @Override
                public void onDraw(Canvas canvas) {
                        super.onDraw(canvas);
                        canvas.drawBitmap(cacheMap, 0, 0, new Paint());
                }

                @Override
                public boolean onTouchEvent(MotionEvent event) {
                        float x = event.getX();
                        float y = event.getY();
                        System.out.println(x + "  " + y);
                        switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                                this.preX = x;
                                this.preY = y;
                                path.moveTo(x, y);
                                break;
                        case MotionEvent.ACTION_MOVE:
                                path.quadTo(preX, preY, x, y);
                                this.preX = x;
                                this.preY = y;
                                break;
                        case MotionEvent.ACTION_UP:
                                this.cacheCanvas.drawPath(path, paint);
                                path.reset();
                                break;
                        default:
                                break;
                        }
                        this.invalidate();
                        return true;
                }

        }
}


打算做一个随手画的小应用。里用了双缓冲写了一个测试类,可是画的时候不会实时显示出来,要用户抬起手时才画上去。
而不用双缓冲的话,就很难实现后期要做的一个功能:撤消操作。
现在有点纠结。
等我想到方法了再发上来吧。


只学java 发表于 2011-8-29 09:44 | 显示全部楼层
过来支持一下
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-27 18:04 , Processed in 0.113428 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表