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;
}
}
}