我想创建一个android项目。其中有一个布局,我希望它在另一个布局上顺利移动。我试图使用线程来做到这一点。但是在我的代码结果中,布局跳转到最终位置,并且不能从偏移平滑移动到目的地。
abs1 = (AbsoluteLayout) findViewById(R.id.absoluteLayout2);
ImageButton ib1 = (ImageButton) findViewById(R.id.imageButton1);
ib1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Runnable r = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
display(100);
display(100);
display(100);
display(100);
display(100);
display(100);
display(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void display(int i) throws InterruptedException {
AbsoluteLayout.LayoutParams param = (AbsoluteLayout.LayoutParams) abs1
.getLayoutParams();
param.x = param.x + 10;
// param.y=param.x+20;
abs1.setLayoutParams(param);
if (Thread.interrupted()) {
throw (new InterruptedException());
}
Thread.sleep(i);
}
};
r.run();
主文件:
<AbsoluteLayout
android:id="@+id/absoluteLayout2"
android:layout_width="107dp"
android:layout_height="308dp"
android:layout_x="10dp"
android:layout_y="12dp"
android:background="@color/red" >
<ImageButton
android:id="@+id/imageButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="0dp"
android:layout_y="0dp"
android:background="@null"
android:src="@drawable/calendar" />
答案 0 :(得分:1)
编辑:从 API 11 开始提供
只需使用ObjectAnimator
:
ObjectAnimator moveToSide = ObjectAnimator.ofFloat(myView, "translationX", 0f, 400f);
moveToSide.setDuration(700);
moveToSide.start();
尝试使用不同的浮点值。现在,它从X轴的原始位置开始到400f。
之后它会保持这个位置。如果你想在开始或结束时做一些事情,你也可以添加一个AnimatorListener
。
moveToSide.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator arg0) {
}
});
答案 1 :(得分:0)
您的Runnable
实际上是在Android的UI线程上运行的
因此sleep()
将阻止UI的绘制过程,显示最终位置的视图
使用Thread
来包装它。
(new Thread(new Runnable() {
@Override
public void run() {
// your code
}
}
})).start();
然后,请记住禁止从非UI线程更新视图
您应该使用runOnUiThread
来更新视图。
runOnUiThread(new Runnable() {
@Override
public void run() {
display(100);
}
}
也许,使用Android的动画类是一种更好的方法。