zoukankan      html  css  js  c++  java
  • 在SurfaceView中自由书写和擦除

    /////////继承SurfaceView 的类
    public class PaintView extends SurfaceView implements Runnable,SurfaceHolder.Callback {
        private float mX;  
        private float mY;  
        private  Paint mPaint = null;  
        private  Path mPath = null; 
        // 线程结束标志位
        boolean mLoop = true;
        SurfaceHolder mSurfaceHolder = null;
       Canvas mCanvas;
    
     public PaintView(Context context, AttributeSet arr) {
            super(context , arr);
                  
            mSurfaceHolder = this.getHolder();//获取holder
            mSurfaceHolder.addCallback(this);
            mSurfaceHolder.setFormat(PixelFormat.OPAQUE);//不透明
            //mSurfaceHolder.setFormat(PixelFormat.RGB_565);
            //mSurfaceHolder.setFormat(PixelFormat.RGBA_8888);
            this.setFocusable(true);
    //        setZOrderOnTop(true);//放到最顶层
            mPaint = new Paint();
            mPath = new Path();
            mPaint.setAntiAlias(true);  
            mPaint.setStyle(Style.STROKE);  
            mPaint.setStrokeWidth(5);  
            mPaint.setColor(mPaintColor);  
            mPaint.setStrokeCap(Paint.Cap.ROUND);  //圆头
            mPaint.setDither(true);//消除拉动,使画面圓滑
            mPaint.setStrokeJoin(Paint.Join.ROUND); //结合方式,平滑
    }
       @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // TODO Auto-generated method stub
            
        }
    
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            new Thread(this).start();//启动线程
        }
    
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            mLoop = false; //结束线程
          
        }
    
    
        @Override
        public void run() {
            while (mLoop==true) {
                    Draw();    
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
     // 画图
        private void Draw() {
            try{
            mCanvas = mSurfaceHolder.lockCanvas();
           
            mCanvas.drawPath(mPath, mPaint);  ////
        
            }catch (Exception e){
                }finally {
                if (mCanvas !=null) {
                    mSurfaceHolder.unlockCanvasAndPost(mCanvas);
                    }
                }
        }
    
       @Override  
        public boolean onTouchEvent(MotionEvent event)  
        {  
            switch (event.getAction())  
            {  
                case MotionEvent.ACTION_DOWN:  
                    touchDown(event);  
                     break;  
                case MotionEvent.ACTION_MOVE:  
                    touchMove(event);  
            }  
            //更新绘制  
            invalidate();  
            return true;  
        }
      
        //手指点下屏幕时调用  
        private void touchDown(MotionEvent event)  
        {  
            //隐藏之前的绘制  
    //        mPath.reset();  //
            float x = event.getX();  
            float y = event.getY();  
              
            mX = x;  
            mY = y;  
            //mPath绘制的绘制起点  
            mPath.moveTo(x, y);  
        }  
          
        //手指在屏幕上滑动时调用  
        private void touchMove(MotionEvent event)  
        {  
            final float x = event.getX();  
            final float y = event.getY();  
      
            final float previousX = mX;  
            final float previousY = mY;  
      
            final float dx = Math.abs(x - previousX);  
            final float dy = Math.abs(y - previousY);  
              
            //两点之间的距离大于等于3时,生成贝塞尔绘制曲线  
            if (dx >= 3 || dy >= 3)  
            {  
                //设置贝塞尔曲线的操作点为起点和终点的一半  
                float cX = (x + previousX) / 2;  
                float cY = (y + previousY) / 2;  
      
                //二次贝塞尔,实现平滑曲线;previousX, previousY为操作点,cX, cY为终点  
                mPath.quadTo(previousX, previousY, cX, cY);  
      
                //第二次运行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值  
                mX = x;  
                mY = y;  
            }  
        }
    ////橡皮擦
       private void setEraser(){
            mPaint = new Paint();
            mPath = new Path();
            mPaint.setAntiAlias(true);  
            mPaint.setStyle(Style.STROKE);  
            mPaint.setStrokeWidth(50);  
    //        mPaint.setColor(mPaintColor);  
            mPaint.setStrokeCap(Paint.Cap.ROUND);  //圆头
            mPaint.setDither(true);//消除拉动,使画面圓滑
            mPaint.setStrokeJoin(Paint.Join.ROUND); //结合方式,平滑
            mPaint.setAlpha(0); ////
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        }
    }
    ////////在Activity中显示以上视图
    setContentView(new PaintView(this));




  • 相关阅读:
    解题:HNOI 2008 玩具装箱
    2016级算法第一次上机助教版解题报告
    求解斐波那契数列复杂度分析
    数据库复习之规范化理论应用(第八次上机内容)
    数据库复习之规范化理论
    题目1042:Coincidence(最长公共子序列)
    题目1020:最小长方形(简单)
    题目1016:火星A+B(字符串拆分)
    题目1014:排名(结构体排序)
    题目1021:统计字符(hash简单应用)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4092799.html
Copyright © 2011-2022 走看看