防止图像视图在触摸和旋转上重叠
问题描述:
在我正在使用的应用程序中,在相对布局中有2个独立的图像视图。我想有两个图像的移动和转动响应给定的动作事件的XML我的活动是:防止图像视图在触摸和旋转上重叠
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.vishalbisht.dragfeature.MainActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:id="@+id/Recycle"
android:layout_alignParentLeft="true" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Ring"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" />
</RelativeLayout>
虽然该计划的部分是:
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
ImageView jwl,rlo;
private final String TAG="DRAGFEATURE";
String Mode;
Bitmap bitmap,rotaBitmap;
BitmapDrawable bdr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jwl= (ImageView) findViewById(R.id.Recycle);
rlo= (ImageView) findViewById(R.id.Ring);
jwl.setImageResource(R.drawable.icon);
rlo.setImageResource(R.drawable.ring);
jwl.setOnTouchListener(this);
rlo.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int eId = event.getActionMasked();
Mode = "Move";
switch (eId) {
case MotionEvent.ACTION_MOVE:
Log.v(TAG,"move image");
drag(v, event);
break;
case MotionEvent.ACTION_DOWN:
r = r + 13;
rotate(v);
break;
default:break;
}
if (v != jwl && v != rlo)
Log.v(TAG,"Not Valid");
return true;
}
private int r =2;
private void rotate(View v) {
if(v==jwl)
bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.icon);
else
bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ring);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.preRotate(-r);
rotaBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix,true);
bdr = new BitmapDrawable(rotaBitmap);
if(v==jwl)
jwl.setImageDrawable(bdr);
else
rlo.setImageDrawable(bdr);
}
private void drag(View v, MotionEvent event) {
RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) jwl.getLayoutParams();
Log.v(TAG,"Start of Move");
int x = (int) event.getRawX();
int y = (int) event.getRawY();
mParams.leftMargin = x - 150;
mParams.topMargin = y - 210;
if(v==jwl)
jwl.setLayoutParams(mParams);
else
rlo.setLayoutParams(mParams);
}
}
当我触摸或拖动左图像(回收),那么它的罚款,但当我点击环,然后两个图像重叠和移动/旋转在一起。为什么会发生这种情况,以及如何解决它?
答
@Override
public boolean onTouch(View view, MotionEvent event) {
int pointerCount = event.getPointerCount();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
// downCounter++;
// Log.v("","Action Down"+downCounter);
startClickTime = Calendar.getInstance().getTimeInMillis();
dX = view.getX() - event.getRawX();
dY = view.getY() - event.getRawY();
final float rawX = event.getRawX();
final float rawY = event.getRawY();
// Remember where we started
mLastTouchX = rawX;
mLastTouchY = rawY;
break;
case MotionEvent.ACTION_MOVE:
// moveCounter++;
// Log.v("", "Action Move "+moveCounter);
if (pointerCount == 1) {
final float x1 = event.getRawX();
final float y1 = event.getRawY();
// Calculate the distance moved
final float dx = x1 - mLastTouchX;
final float dy = y1 - mLastTouchY;
// Make sure we will still be the in parent's container
Rect parent = new Rect(0, 0, root.getWidth(), root.getHeight());
//Find what the bounds of view will be after moving
int newLeft = (int) (view.getX() + dx),
newTop = (int) (view.getY() + dy),
newRight = newLeft + view.getWidth(),
newBottom = newTop + view.getHeight();
if (!parent.contains(newLeft, newTop, newRight, newBottom)) {
Log.v("", "Out of Bounds");
} else {
// Move the object
view.animate().
x(x1 + dX).
y(y1 + dY).
setDuration(0).
start();
// Remember this touch position for the next move event
mLastTouchX = x1;
mLastTouchY = y1;
// Invalidate to request a redraw
root.invalidate();
break;
}
}
// if(mode==2)
if (pointerCount == 2)
{
long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
if(clickDuration > MAX_CLICK_DURATION) {
//Log.v(TAG, "for rotation");
float degree = rotation(event);
//Log.v(TAG, "setting at angle" + degree);
view.setRotation(view.getRotation() + degree);
break;
}
}
break;
case MotionEvent.ACTION_UP:
// upCounter++;
// Log.v(TAG,"Action Up"+upCounter);
/* case MotionEvent.ACTION_POINTER_DOWN:
Log.v(TAG, "ACTION POINTER DOWN");
if (pointerCount == 2) {
flagFirstTouch = 1;
}
break;*/
}
return true;
}
我用这个排序我的问题,我希望这可以帮助别人。
此外,保持双方在父RelativeLayout.The frameLayouts内单独frameLayouts图像视图可以有两种高度andwidth
答
如下改变你的布局XML:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:id="@+id/Recycle"
android:layout_alignParentLeft="true" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Ring"
android:layout_toRightOf="@+id/Recycle"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" />
我只是想你的解决方案,而这是移动ImageView的ID肯定更好属性WRAP_CONTENT:回收当我触摸Imageview ID时,我仍然遇到同样的问题:响铃或拖动它。 –