0

我想创建一个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" />
4

2 回答 2

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) {
        }
    });
于 2013-09-03T07:11:15.157 回答
0

Runnable实际上是在 Android 的 UI 线程上运行的。
所以sleep()会阻塞 UI 的绘制过程,在最终位置显示视图。
使用 aThread包裹它。

(new Thread(new Runnable() {
         @Override
         public void run() {
             // your code
         }
    }
})).start();    

然后,请记住,禁止从非 UI 线程更新视图。
您应该使用runOnUiThread来更新视图。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        display(100);
    }
}

也许,使用 Android 的 Animation 类是一种更好的方法。

于 2013-09-03T09:46:10.103 回答