2015-04-03 59 views
0

要求:圖像查看閃爍上的觸摸事件在調整大小時

要在彼此可在觸摸事件調整大小(只高度)的頂部創建圖像視圖的列表。調整一個視圖的大小不應調整其他視圖的大小。

問題:

我創建了一個相對佈局和我使用ALIGN_PARENT_BOTTOM.我添加底圖像視圖上述多個圖像視圖對準我第一個孩子(圖像視圖),以相對佈局的底部。我還實現了觸摸事件的圖像調整大小,如下所示。問題是當我在ACTION_MOVE上調整大小時,圖像視圖閃爍。如果我將我的第一個孩子(圖片視圖)對齊,則不會發生。我相信這是因爲ALIGN_PARENT_BOTTOM被稱爲觸摸事件。不知道如何解決這個問題。

反饋:

也希望得到反饋,這種方法以滿足requirements.I我不知道是表現在這種方法中不利的一面。

任何幫助被讚賞。謝謝!

public class StackLayoutActivity extends ActionBarActivity { 

private float mLastTouchX; 
private float mLastTouchY; 
private int mActivePointerId; 
private float mPosX; 
private float mPosY; 
private static final int INVALID_POINTER_ID = -1; 
private ImageView imageViewTwo; 
private ImageView imageViewOne; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.stack_layout); 
    init(); 
} 

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 
private void init() { 
    int imageTwoHeight = 250; 
    int imageOneHeight = 400; 
    RelativeLayout.LayoutParams imageTwoParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, imageTwoHeight); 
    RelativeLayout.LayoutParams imageOneParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, imageOneHeight); 

    imageViewTwo = new ImageView(getApplicationContext()); 
    imageViewTwo.setScaleType(ImageView.ScaleType.MATRIX); 
    imageViewTwo.setImageDrawable(getResources().getDrawable(R.drawable.abc_ic_menu_moreoverflow_mtrl_alpha)); 
    imageViewTwo.setId(View.generateViewId()); 
    imageViewTwo.setOnTouchListener(new ImageTwoTouchListener()); 

    imageViewOne = new ImageView(getApplicationContext()); 
    imageOneParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); 
    imageViewOne.setLayoutParams(imageOneParams); 
    imageViewOne.setScaleType(ImageView.ScaleType.MATRIX); 
    imageViewOne.setImageDrawable(getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha)); 
    imageViewOne.setId(View.generateViewId()); 
    imageViewOne.setOnTouchListener(new ImageOneTouchListener()); 
    RelativeLayout layout = (RelativeLayout) this.findViewById(R.id.container); 

    imageTwoParams.addRule(RelativeLayout.ABOVE, imageViewOne.getId()); 
    layout.addView(imageViewOne); 
    layout.addView(imageViewTwo, imageTwoParams); 
} 


private class ImageOneTouchListener implements View.OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent ev) { 
     final int action = ev.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: { 
       final float x = ev.getX(); 
       final float y = ev.getY(); 

       mLastTouchX = x; 
       mLastTouchY = y; 
       mActivePointerId = ev.getPointerId(0); 
       break; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
       final float x = ev.getX(pointerIndex); 
       final float y = ev.getY(pointerIndex); 


       final float dist = y - mLastTouchY; 

       // Only move if the ScaleGestureDetector isn't processing a gesture. 
       final float dx = x - mLastTouchX; 
       final float dy = y - mLastTouchY; 

       mPosX += dx; 
       mPosY += dy; 

       mLastTouchX = x; 
       mLastTouchY = y; 

       ViewGroup.LayoutParams lp = imageViewOne.getLayoutParams(); 
       lp.height -= dist; 
       imageViewOne.setLayoutParams(lp); 
       break; 
      } 

      case MotionEvent.ACTION_UP: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_CANCEL: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 
     } 

     return true; 
    } 
} 

private class ImageTwoTouchListener implements View.OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent ev) { 
     final int action = ev.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: { 
       final float x = ev.getX(); 
       final float y = ev.getY(); 

       mLastTouchX = x; 
       mLastTouchY = y; 
       mActivePointerId = ev.getPointerId(0); 
       break; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
       final float x = ev.getX(pointerIndex); 
       final float y = ev.getY(pointerIndex); 

       final float dist = y - mLastTouchY; 

       // Only move if the ScaleGestureDetector isn't processing a gesture. 
       final float dx = x - mLastTouchX; 
       final float dy = y - mLastTouchY; 

       mPosX += dx; 
       mPosY += dy; 


       mLastTouchX = x; 
       mLastTouchY = y; 

       ViewGroup.LayoutParams lp = imageViewTwo.getLayoutParams(); 
       lp.height -= dist; 
       imageViewTwo.setLayoutParams(lp); 

       break; 
      } 

      case MotionEvent.ACTION_UP: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_CANCEL: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 
     } 

     return true; 
    } 
} 
} 

回答

0

通過刪除對ACTION_MOVE中最後一次觸摸位置的修改來修復閃爍問題。從ACTION_MOVE塊刪除以下代碼塊

mLastTouchX = x; 
mLastTouchY = y;