移动位图时遇到问题。 位图大于屏幕。 代码xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lay_mapa"
android:clipChildren="false" >
<ImageView
android:id="@+id/iv_mapa_swiata"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/mapa_swiata"
android:scaleType="center"
android:padding="0dp"
android:paddingBottom="0dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:paddingTop="0dp"/>
</RelativeLayout>
java文件中的代码:
int xCoOrdinate;
int yCoOrdinate;
ImageView mapa_swiata;
on onCreate:
mapa_swiata.setOnTouchListener(this);
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
xCoOrdinate = (int) (v.getX() - event.getRawX());
yCoOrdinate = (int) (v.getY() - event.getRawY());
break;
case MotionEvent.ACTION_MOVE:
v.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start();
break;
}
return true;
}
图片以一种相当不可预测的方式移动。以下电影说明了这一点: https://youtu.be/BJyQjNmj-J4
答案 0 :(得分:0)
根据经验,处理这些问题在进行自定义视图时会非常痛苦。我建议使用现成的库,如: https://github.com/chrisbanes/PhotoView
他们已经解决了你将遇到的大部分问题。
然而,回到代码。您将为所有活动返回true。这可能会使视图处于一种奇怪的状态,尤其是标记为已消耗的ACTION_UP
事件。
这样的事情可能有用:
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
xCoOrdinate = (int) (v.getX() - event.getRawX());
yCoOrdinate = (int) (v.getY() - event.getRawY());
return true;
case MotionEvent.ACTION_MOVE:
v.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start();
return true;
default:
return false;
}
}
<强>更新强>
好的,这是其他一些想法。失去动画。不确定它是不是发生了什么。您可以使用以下内容设置视图的翻译:{{1}}和setTranslationX()
,触摸传感器中的事件应足以使其感觉平滑。
尝试使用setTranslationY()
作为父级。此处无需使用FrameLayout
。
另外,我建议将坐标值保留为浮点数,因为在该类型上始终需要它们。保存必须改变数字精度。