2016-11-11 49 views
0

我试图在基于3个变量(gyroxaxis,gyroYaxis,gyroZaxis)更新每毫秒(因此图像将不断移动)的活动中移动两个图像。图像必须保持在屏幕的边界内,因此还需要执行矩阵。Android在屏幕边界内移动图像

我试过以下 ImageView Drag Limitation In Android 问题,但我的设置有点不同。

全局变量

ImageView imageView1; 
ImageView imageView2; 

// gyro float variables get updated every millisecond in a different function 
float gyroXaxis; 
float gyroYaxis; 
float gyroZaxis; 

private Matrix matrix = new Matrix(); 
private Matrix savedMatrix = new Matrix(); 

PointF DownPT = new PointF(); 
PointF StartPT = new PointF(); 

的OnCreate

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

    setContentView(R.layout.activity_version); 
    // Create images 
    imageView1 = (ImageView) findViewById(R.id.image1); 
    Drawable drawableImage1 = getDrawable(R.drawable.image1); 
    imageView1.setImageDrawable(drawableChromoX); 

    imageView2 = (ImageView) findViewById(R.id.image2); 
    Drawable drawableImage2 = getDrawable(R.drawable.image2); 
    imageView2.setImageDrawable(drawableChromoY); 

    View.OnTouchListener listener = new View.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (v.getTag() != null && v.getTag().equals("image1")) { 
       int eid = event.getAction(); 
       switch (eid) { 
        case MotionEvent.ACTION_MOVE: 
         PointF mv = new PointF(event.getX() - DownPT.x, event.getY() - DownPT.y); 
         imageView1.setX((int) (StartPT.x + mv.x)); 
         imageView1.setY((int) (StartPT.y + mv.y)); 
         StartPT = new PointF(imageView1.getX(), imageView1.getY()); 
         break; 
        case MotionEvent.ACTION_DOWN: 
         DownPT.x = event.getX(); 
         DownPT.y = event.getY(); 
         StartPT = new PointF(imageView1.getX(), imageView1.getY()); 
         break; 
        case MotionEvent.ACTION_UP: 
         break; 

        default: 
         break; 
       } 
      } 
      else if (v.getTag() != null && v.getTag().equals("image2")) { 
       int eid = event.getAction(); 
       switch (eid) 
       { 
        case MotionEvent.ACTION_MOVE : 
         PointF mv = new PointF(event.getX() - DownPT.x, event.getY() - DownPT.y); 
         imageView2.setX((int)(StartPT.x+mv.x)); 
         imageView2.setY((int)(StartPT.y+mv.y)); 
         StartPT = new PointF(imageView2.getX(), imageView2.getY()); 
         break; 
        case MotionEvent.ACTION_DOWN : 
         DownPT.x = event.getX(); 
         DownPT.y = event.getY(); 
         StartPT = new PointF(imageView2.getX(), imageView2.getY()); 
         break; 
        case MotionEvent.ACTION_UP : 
         break; 
        default : 
         break; 
       } 
      } 
      return true; 

     } 
    }; 

    imageView1.setOnTouchListener(listener); 
    imageView2.setOnTouchListener(listener); 
} 
+0

我重新用这个画布来表扬。 –

+0

@ Sub6Resources是否有任何示例? – Pie

+0

有几个教程,主要用于游戏,那里应该可以帮助你熟悉SurfaceView,它本质上是一个画布视图。这里是一个:https://www.simplifiedcoding.net/android-game-development-tutorial-surface-view/ –

回答

0

鉴于你的示例代码,你可以做这样的事情,为了保持一定的边界内的ImageView:

final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
// Display Rect Boundaries 
final Rect parentRect = new Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); 

// original down point 
final PointF offsetPoint = new PointF(); 

imageView1.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(final View view, final MotionEvent motionEvent) { 
     final int action = motionEvent.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       offsetPoint.x = motionEvent.getX(); 
       offsetPoint.y = motionEvent.getY(); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       float x = motionEvent.getX(); 
       float y = motionEvent.getY(); 

       imageView1.offsetLeftAndRight((int) (x - offsetPoint.x)); 
       imageView1.offsetTopAndBottom((int) (y - offsetPoint.y)); 

       // check boundaries 
       if (imageView1.getRight() > parentRect.right) { 
        imageView1.offsetLeftAndRight(-(imageView1.getRight() - parentRect.right)); 
       } else if (imageView1.getLeft() < parentRect.left) { 
        imageView1.offsetLeftAndRight((parentRect.left - imageView1.getLeft())); 
       } 

       if (imageView1.getBottom() > parentRect.bottom) { 
        imageView1.offsetTopAndBottom(-(imageView1.getBottom() - parentRect.bottom)); 
       } else if (imageView1.getTop() < parentRect.top) { 
        imageView1.offsetTopAndBottom((parentRect.top - imageView1.getTop())); 
       } 

       break; 
     } 
     return true; 
    } 
}); 
+0

我怎样才能使用其中一个陀螺变量来移动图像?例如,如果y变量每秒大于5次,则图像向下10dp。同时确保不要将图像从屏幕上移开。 – Pie

+0

我试过这段代码,它对左边,顶边和右边都很好。但由于某种原因,在底部边缘上,我可以移动视图,使其一半走过底部边缘。为什么会发生这种情况 – se22as