我正在使用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;
}
});
}
}
答案 0 :(得分:0)
有一段时间有类似的question。
解决方案是使用setX(getX() + ...)
代替setTranslationX(...)
。我仍然不知道为什么会出现这种情况。