Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android布局随线程移动_Android_Multithreading - Fatal编程技术网

android布局随线程移动

android布局随线程移动,android,multithreading,Android,Multithreading,我想创建一个android项目。这是一个布局,我希望它在另一个布局上平滑移动。我已经尝试使用线程来实现这一点。但是在我的代码的结果中,布局跳转到它的最终位置,并且不能从偏移平滑地移动到它的目标 abs1 = (AbsoluteLayout) findViewById(R.id.absoluteLayout2); ImageButton ib1 = (ImageButton) findViewById(R.id.imageButton1); ib1.setOnClickLi

我想创建一个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();
主文件:


编辑:这从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) {
        }
    });

您的
Runnable
实际上是在Android的UI线程上运行的。
因此
sleep()
将阻止UI的绘图过程,在最终位置显示视图。
使用
线程
将其包裹起来

(new Thread(new Runnable() {
         @Override
         public void run() {
             // your code
         }
    }
})).start();    
然后,请记住,禁止从非UI线程更新视图。
您应该使用
runOnUiThread
更新视图

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

也许,使用Android的动画类是更好的方法。

它应该向哪个方向移动?你不必使用线程。请看下面我的答案不要使用绝对布局…这是不推荐的…很好的答案!多谢各位
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        display(100);
    }
}