2016-11-11 15 views
0

私は3つの変数(gyroXaxis、gyroYaxis、gyroZaxis)に基づいて2つの画像を1ミリ秒ごとに移動しようとしています(画像が常に動くようになります)。画像は画面の境界内に留まらなければならず、マトリックスの実装も同様に必要です。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に慣れるのに役立つ、主にゲーム向けのチュートリアルがいくつかあります。これは1つです: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より大きい場合、1秒ごとにイメージが10dpだけ下がります。また、画面から画像を移動しないようにしてください。 – Pie

+0

このコードを試してみましたが、左上、右上、右端でうまく動作します。しかし何らかの理由で、下端で私は私の視点を動かすことができるので、その半分が下端を通過します。なぜこれが起こるのか? – se22as

関連する問題