Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.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:如何在可移动图像上绘制矩形,使绘制的矩形也随图像移动?_Android_Surfaceview - Fatal编程技术网

Android:如何在可移动图像上绘制矩形,使绘制的矩形也随图像移动?

Android:如何在可移动图像上绘制矩形,使绘制的矩形也随图像移动?,android,surfaceview,Android,Surfaceview,我有一个可以在整个屏幕上移动的图像。现在,我想在这个图像上画一个矩形,这样当我移动图像时,在图像上画的矩形也会移动。目前,我能够绘制矩形不是在图像上,而是在包含图像的SurfaceView上。我现在的代码如下 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt

我有一个可以在整个屏幕上移动的图像。现在,我想在这个图像上画一个矩形,这样当我移动图像时,在图像上画的矩形也会移动。目前,我能够绘制矩形不是在图像上,而是在包含图像的SurfaceView上。我现在的代码如下

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);       


      int w=getWindowManager().getDefaultDisplay().getWidth()-25;
      int h=getWindowManager().getDefaultDisplay().getHeight()-25;

      MySurfaceView mySurface=new MySurfaceView(this,w,h);
      setContentView(mySurface);
  }
}
我有一个叫做MySurfaceView.java的类

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

    private Bitmap bitmap ;
    private MyThread thread;
    private int x=20,y=20;int width,height;

    public MySurfaceView(Context context,int w,int h) {
        super(context);

        width=w;
        height=h;
        thread=new MyThread(getHolder(),this);
        getHolder().addCallback(this);
        setFocusable(true);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.my_pic);
        canvas.drawColor(Color.BLUE);//To make background 
        canvas.drawBitmap(bitmap,x-(bitmap.getWidth()/2),y-(bitmap.getHeight()/2),null);


        Paint paintShape = new Paint();
        paintShape.setColor(Color.BLACK);
        paintShape.setStyle(Paint.Style.STROKE);

        Rect myRectangle = new Rect();
        myRectangle.set(0, 100, canvas.getWidth()/4, canvas.getHeight()/4);

        canvas.drawRect(myRectangle, paintShape);


    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        x=(int)event.getX();
        y=(int)event.getY();

        if(x<25)
                x=25;
         if(x> width)   
                x=width;
         if(y <25)
                y=25;
         if(y > 405)
                y=405;      
        return true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        thread.startrun(true);
        thread.start();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {


        thread.startrun(false);
        thread.stop();

    }

    public class MyThread extends Thread{

        private SurfaceHolder msurfaceHolder;
        private MySurfaceView mSurfaceView;
        private boolean mrun =false;

        public MyThread(SurfaceHolder holder, MySurfaceView mSurfaceView) {

            this.msurfaceHolder = holder;
            this.mSurfaceView=mSurfaceView;
        }

        public void startrun(boolean run) {

            mrun=run;
        }

        @SuppressLint("WrongCall")
        @Override
        public void run() {

            super.run();
             Canvas canvas;
             while (mrun) {
                canvas=null;
                 try {
                     canvas = msurfaceHolder.lockCanvas(null);
                      synchronized (msurfaceHolder) {
                       mSurfaceView.onDraw(canvas);
                     }
                 } finally {
                         if (canvas != null) {
                         msurfaceHolder.unlockCanvasAndPost(canvas);
                     }
                 }
             }
          }
    }
 }
公共类MySurfaceView扩展了SurfaceView,实现了SurfaceHolder.Callback{
私有位图;
私有线程;
私有整数x=20,y=20;整数宽度,高度;
公共MySurfaceView(上下文上下文,int w,int h){
超级(上下文);
宽度=w;
高度=h;
thread=newmythread(getHolder(),this);
getHolder().addCallback(此);
设置聚焦(真);
}
@凌驾
公共空白onDraw(画布){
super.onDraw(帆布);
bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.my_pic);
canvas.drawColor(Color.BLUE);//用于制作背景
drawBitmap(位图,x-(位图.getWidth()/2),y-(位图.getHeight()/2),null);
paintpaintshape=新油漆();
paintShape.setColor(Color.BLACK);
paintShape.setStyle(Paint.Style.STROKE);
Rect myRectangle=new Rect();
myRectangle.set(0,100,canvas.getWidth()/4,canvas.getHeight()/4);
canvas.drawRect(myRectangle,paintShape);
}
@凌驾
公共布尔onTouchEvent(运动事件){
x=(int)event.getX();
y=(int)event.getY();
如果(x宽度)
x=宽度;
如果(y 405)
y=405;
返回true;
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
//TODO自动生成的方法存根
}
@凌驾
已创建的公共空白表面(表面持有人){
线程。startrun(真);
thread.start();
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
线程。startrun(错误);
thread.stop();
}
公共类MyThread扩展线程{
私人地表持有人;
私有MySurfaceView-mSurfaceView;
私有布尔值mrun=false;
公共MyThread(SurfaceHolder持有者,MySurfaceView mSurfaceView){
this.msurfaceHolder=holder;
this.mSurfaceView=mSurfaceView;
}
公共void startrun(布尔运行){
mrun=运行;
}
@SuppressLint(“错误呼叫”)
@凌驾
公开募捐{
super.run();
帆布;
while(mrun){
canvas=null;
试一试{
canvas=msurfaceHolder.lockCanvas(null);
已同步(msurfaceHolder){
mSurfaceView.onDraw(画布);
}
}最后{
if(canvas!=null){
msurfaceHolder.unlockCanvasAndPost(画布);
}
}
}
}
}
}

有人能帮助我改进代码以适应上述所需的任务吗。谢谢

在onCreate中,为该位图创建新位图图像和画布。使用该画布绘制原始位图和新位图的矩形。然后在onDraw中,只要你想在任何地方绘制新的位图。作为奖励,你可以很快画出来。

嗯,我有自己的想法。这只是上述代码中的一个小改动,这是必要的。定义矩形相对于由触摸事件获得的x和y的坐标就足够了。例如,您可以执行以下操作:

myRectangle.set(x-50, y-50, x+50, y+50);

其余部分将自动处理。

嘿,盖布,恐怕这不起作用。我的更改是:在OnCreate方法中,我添加了Bitmap Bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.My_pic);画布mCanvas=新画布(位图);我在SurfaceView的构造函数中接收mCanvas,然后使用mCanvas在Ondraw方法中绘制矩形,而不是使用Ondraw()的画布。这样做之后,我得到的只是一个黑屏,一旦检查logcat,我就可以理解代码的某些部分将进行无限循环。我希望这就是你想要我做的。等待你的答复。