2016-04-04 14 views
0

ドラッグされているときに、可動式のimageViewを実装したい。ドラッグは完全に問題なく動作しています。しかし、最後までドラッグすると、imageViewが画面外に出ます。 イメージビューの移動を画面内でのみ行うにはどうすればいいですか?Imageviewをドラッグすると画面の外に出る

これは私のOnTouch listernerです:

public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
     dX = view.getX() - event.getRawX(); 
     dY = view.getY() - event.getRawY(); 
     lastAction = MotionEvent.ACTION_DOWN; 
     break; 

     case MotionEvent.ACTION_MOVE: 
     view.setY(event.getRawY() + dY); 
     view.setX(event.getRawX() + dX); 
     lastAction = MotionEvent.ACTION_MOVE; 
     break; 

     case MotionEvent.ACTION_UP: 
     if (lastAction == MotionEvent.ACTION_DOWN) 
      Toast.makeText(DraggableView.this, "Clicked!", Toast.LENGTH_SHORT).show(); 
     break; 

     default: 
     return false; 
    } 
    return true; 
    } 

と、これは私のレイアウトです。レイアウトにはスクロールビューとその子、ドラッグしたい画像ビューが含まれています。

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="400dp" 
       android:background="#ff0000" 
       android:gravity="center" 
       android:text="View 1" 
       android:textColor="#000" 
       android:textSize="100dp" /> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="400dp" 
       android:background="#00ff00" 
       android:text="View 2" 
       android:textColor="#000" 
       android:textSize="100dp" /> 
     </LinearLayout> 
    </ScrollView> 

    <ImageView 
     android:id="@+id/draggable_view" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_gravity="bottom|right" 
     android:layout_marginBottom="20dp" 
     android:layout_marginEnd="20dp" 
     android:background="@drawable/icon" /> 

</FrameLayout> 

答えて

2

最終的に最良の解決策を見つける。それは完璧に働いて

DisplayMetrics displaymetrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
screenHight = displaymetrics.heightPixels; 
screenWidth = displaymetrics.widthPixels; 

    @SuppressLint("NewApi") @Override 
    public boolean onTouch(View view, MotionEvent event) { 


     float newX, newY; 

    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 

     dX = view.getX() - event.getRawX(); 
     dY = view.getY() - event.getRawY(); 
     lastAction = MotionEvent.ACTION_DOWN; 
     break; 

     case MotionEvent.ACTION_MOVE: 

      newX = event.getRawX() + dX; 
      newY = event.getRawY() + dY; 

     // check if the view out of screen 
      if ((newX <= 0 || newX >= screenWidth-view.getWidth()) || (newY <= 0 || newY >= screenHight-view.getHeight())) 
      { 
       lastAction = MotionEvent.ACTION_MOVE; 
       break;  
      } 

     view.setX(newX); 
     view.setY(newY); 

     lastAction = MotionEvent.ACTION_MOVE; 

     break; 

     case MotionEvent.ACTION_UP: 
     if (lastAction == MotionEvent.ACTION_DOWN) 
      Toast.makeText(DraggableView.this, "Clicked!", Toast.LENGTH_SHORT).show(); 
     break; 

     default: 
     return false; 
    } 
    return true; 
    } 

:)

:として

私のOnTouchのlisternerセクションを変更します。

関連する問題