当我用手指移动时,为什么我的FrameLayout如此不稳定?

时间:2014-11-22 10:39:56

标签: android

我正在使用onTouchListener()用手指移动FrameLayout进行一些测试。我看到的一个问题是FrameLayout并没有真正跟随我的手指动作,另一个问题是当我移动它时FrameLayout非常不连贯。由于波动,我的意思是当我用手指移动时,FrameLayout在屏幕上的两个位置之间反弹非常快。我用ImageView而不是FrameLayout尝试了这个,并且得到了相同的不稳定性。我做错了什么?

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}" >

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="#808080" 
    android:id="@+id/parent_frame">

    <FrameLayout
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#FFFFFF" 
        android:id="@+id/child_frame">
    </FrameLayout>

</FrameLayout>

代码:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.view.MotionEvent;

public class MainActivity extends Activity {

private FrameLayout parent_frame;
private FrameLayout child_frame;

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

    parent_frame = (FrameLayout) findViewById(R.id.parent_frame);
    child_frame = (FrameLayout) findViewById(R.id.child_frame);

    child_frame.setOnTouchListener(new OnTouchListener() {
        float x;
        float y;
        float last_x;
        float last_y;
        float dx;
        float dy;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                x = event.getX();
                y = event.getY();
                last_x = x;
                last_y = y;
                break;

            case MotionEvent.ACTION_MOVE:
                x = event.getX();
                y = event.getY();
                dx = x - last_x;
                dy = y - last_y;
                child_frame.setTranslationX(child_frame.getTranslationX() + dx);
                child_frame.setTranslationY(child_frame.getTranslationY() + dy);
                last_x = x;
                last_y = y;
                break;
            }


            return true;
        }
    });

}


}

1 个答案:

答案 0 :(得分:0)

有一段时间有类似的question

解决方案是使用setX(getX() + ...)代替setTranslationX(...)。我仍然不知道为什么会出现这种情况。