android - 位图移动无效

时间:2017-10-11 16:21:33

标签: android android-layout android-fragments

移动位图时遇到问题。 位图大于屏幕。 代码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

1 个答案:

答案 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

另外,我建议将坐标值保留为浮点数,因为在该类型上始终需要它们。保存必须改变数字精度。