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




  • 相关阅读:
    Linq to OBJECT延时标准查询操作符
    LINQ to XML
    动态Linq(结合反射)
    HDU 1242 dFS 找目标最短路
    HDu1241 DFS搜索
    hdu 1224 最长路
    BOJ 2773 第K个与m互质的数
    ZOJ 2562 反素数
    2016 ccpc 杭州赛区的总结
    bfs UESTC 381 Knight and Rook
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4092799.html
Copyright © 2011-2022 走看看