Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android在surfaceview子类上放置一个层用于绘图_Android_Multithreading_Android Canvas_Surfaceview - Fatal编程技术网

android在surfaceview子类上放置一个层用于绘图

android在surfaceview子类上放置一个层用于绘图,android,multithreading,android-canvas,surfaceview,Android,Multithreading,Android Canvas,Surfaceview,我正在开发一个触摸式绘图的应用程序。我正在推动SurfaceView子类绘制我的画布 我的图纸分为两种类型: 移动触摸动作时的临时画布绘制 画在不应清除的动作上的画布 我知道我可以通过 mSurfaceHolder.lockCanvas(); 但是我需要另一个层,它的画布独立于SurfaceView 用于动作的绘图\u MOVE工作正常。但我想画一个永久的形状,每次我们开始行动时它都会被移除。 这是我的密码: public class DrawSurfaceView extends Su

我正在开发一个触摸式绘图的应用程序。我正在推动SurfaceView子类绘制我的画布

我的图纸分为两种类型:

  • 移动触摸动作时的临时画布绘制
  • 画在不应清除的动作上的画布
我知道我可以通过

mSurfaceHolder.lockCanvas();
但是我需要另一个层,它的画布独立于SurfaceView

用于动作的绘图\u MOVE工作正常。但我想画一个永久的形状,每次我们开始行动时它都会被移除。 这是我的密码:

public class DrawSurfaceView  extends SurfaceView implements SurfaceHolder.Callback {

   SurfaceHolder mSurfaceHolder;
    Paint paint = new Paint();
    int startX, startY, endX, endY;
    Canvas canvas = null;
    Thread draw;

    /**
     * Utilisé pour construire la vue depuis XML avec un style
     * @param context le contexte qui héberge la vue
     * @param attrs les attributs définis en XML
     * @param defStyle référence au style associé
     */
     public DrawSurfaceView(Context context, AttributeSet attrs) {
     super(context, attrs);
     mSurfaceHolder = getHolder();
     this.setBackgroundColor(Color.WHITE);                 
     this.setZOrderOnTop(true); //necessary                
     mSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT); 
     mSurfaceHolder.addCallback(this);


     }

     @Override
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
     }

     @Override
     public void surfaceCreated(SurfaceHolder holder) {

     }

     @Override
     public void surfaceDestroyed(SurfaceHolder holder) {
     }

     @Override
     protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.BLUE);
            paint.setStrokeWidth(3);
            canvas.drawRect(startX, startY, endX, endY, paint);

     }

     @Override
     public boolean onTouchEvent(MotionEvent event) {
         super.onTouchEvent(event);
      // TODO Auto-generated method stub
      int x = (int) event.getX();
      int y = (int) event.getY();
    if(x<0 || y<0){
            return false;
    }else{
      int action = event.getAction();
      switch(action){
      case MotionEvent.ACTION_DOWN:
       startX = x ;
       startY = y;
       endX = x;
       endY = y ;
       break;
      case MotionEvent.ACTION_MOVE:

          endX = x;
           endY = y ;
           draw = new DrawingThread();
           draw.start();
       break;
      case MotionEvent.ACTION_UP:
       endX = x;
       endY = y ;
     //what should Put Here ?????????
       break;
       }
    return true;
        }
     }

     private class DrawingThread extends Thread {
                boolean keepDrawing = true;
                @Override
                public void run() {

                    while (keepDrawing) {
                        Canvas canvas = null;
                        try {
                            canvas = mSurfaceHolder.lockCanvas();
                            synchronized (mSurfaceHolder) {
                                onDraw(canvas);
                            }
                        } finally {
                            if (canvas != null)
                                mSurfaceHolder.unlockCanvasAndPost(canvas);
                        }
                        try {
                            Thread.sleep(20);
                        } catch (InterruptedException e) {}
                    }
                }
            }
}
公共类DrawSurfaceView扩展了SurfaceView,实现了SurfaceHolder.Callback{
表面支架;
油漆=新油漆();
int startX、startY、endX、endY;
Canvas=null;
螺纹拉伸;
/**
*使用联合国风格的XML文档
*@param context le contexte qui héberge la vue
*@param attrs les attributes définis en XML
*@param defStyle référence au style associé
*/
公共DrawSurfaceView(上下文、属性集属性){
超级(上下文,attrs);
mSurfaceHolder=getHolder();
这个.setBackgroundColor(Color.WHITE);
this.setZOrderOnTop(true);//必要
mSurfaceHolder.setFormat(像素格式.半透明);
mSurfaceHolder.addCallback(此);
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
}
@凌驾
已创建的公共空白表面(表面持有人){
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
}
@凌驾
受保护的void onDraw(画布){
canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);
绘制.设置样式(绘制.样式.笔划);
油漆。设置颜色(颜色。蓝色);
油漆。设置行程宽度(3);
canvas.drawRect(startX、startY、endX、endY、paint);
}
@凌驾
公共布尔onTouchEvent(运动事件){
超级事件(事件);
//TODO自动生成的方法存根
int x=(int)event.getX();
int y=(int)event.getY();

如果(x我自己找到了解决方案

我刚刚从实现onTouchListener的主活动调用了onTouchEvent。 我像这样重写了onTouch方法

@Override
public boolean onTouch(View v, MotionEvent event) {
    SurfaceViewSubClass1.onTouchEvent(event);       
    SurfaceViewSubClass2.onTouchEvent(event);
    return true;        
}
通过设置
setOnTouchListener(this);
onCreate()
中的我的前台SurfaceView子类
SurfaceViewSubClass1