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