在Android中每隔一秒逐像素地移动textview

时间:2013-06-03 11:19:45

标签: android textview runnable

我的Android应用中有一个TextView。我希望每隔一个像素移动一次TextView。我正在使用setX方法移动textView。如果我使用一个按钮并单击它,它工作正常。随着每次单击都会移动textview,但是当我尝试使用带有处理程序的循环自动化它时,它不会平滑移动,它只是毫不拖延地冲到屏幕左侧。这是我正在使用的代码

    int i = (int) txtView.getX();    
    while (i>0)
    {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable()
        {
             @Override
            public void run()
            {
               txtView.setX((int) txtView.getX() - 1);
            }
        }, 1000)
    i--;
  }

5 个答案:

答案 0 :(得分:2)

因为您正在设置posDelayed操作而没有任何dealy。你在执行runnable之前设置了延迟。但是你的while循环的两次迭代之间没有延迟

perhapse你可以做这样的事情

      handler.postDelayed(r, 1000);

      Runnable r = new Runnable()
        {
             @Override
            public void run()
            {
               txtView.setX((int) txtView.getX() - 1);

               i--;
               if(i>0)
                    handler.postDelayed(r,1000);
            }
        }

答案 1 :(得分:0)

int i = (int) txtView.getX();    
while (i>0)
{
    txtView.setX((int) txtView.getX() - 1);
    Thread.sleep(1000);
    i--;
}

答案 2 :(得分:0)

使用此课程

 public class TypeWriter extends TextView {

    private CharSequence mText;
    private int mIndex;
    private long mDelay = 500; //Default 500ms delay

    public TypeWriter(Context context) {
        super(context);
    }

    public TypeWriter(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private Handler mHandler = new Handler();
    private Runnable characterAdder = new Runnable() {
        @Override
        public void run() {
            batterLevel.setText(mText.subSequence(0, mIndex++));
            if(mIndex <= mText.length()) {
                mHandler.postDelayed(characterAdder, mDelay);
            }
        }
    };

    public void animateText(CharSequence text) {
        mText = text;
        mIndex = 0;

        batterLevel.setText("");
        mHandler.removeCallbacks(characterAdder);
        mHandler.postDelayed(characterAdder, mDelay);
    }


    public void setCharacterDelay(long millis) {
        mDelay = millis;
    }
}

并在您的活动电话中使用它,如下所示

 private TypeWriter writer;


 writer = new TypeWriter(getActivity());
 writer.setCharacterDelay(150);
 writer.animateText(todisplay);

答案 3 :(得分:0)

我设法用AsyncTask做到了这一点:

private class Task extends AsyncTask<Void, Void, Void> {    

    private Button mMyButton;

    public Task(Button myButton) {
        mMyButton = myButton;
    }

    @Override
    protected Void doInBackground(Void... params){
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void v)
    {
        mMyButton.setX(mMyButton.getX() + 1);
    }
}

当你想要它移动元素时,请执行以下操作:

int pixels = 50;
Button myButton = (Button) findViewById(R.id.button1);
for( int i = 0; i < pixels; ++i) {
    new Task(myButton).execute();
}

当然,您可以将Button更改为您喜欢的内容。

答案 4 :(得分:0)

您的代码在实际循环中没有延迟。因此,在一秒钟之后,您发布到处理程序的所有Runnables将按顺序执行。

在代码中的实际调用之间添加延迟。下面的粗略代码:

//Handler used to post to UI thread.
final Handler handler = new Handler();

new Thread()
{
    int i = (int) txtView.getX();    
        while (i>0)
        {
            handler.post(new Runnable()
            {
                 @Override
                public void run()
                {
                   txtView.setX((int) txtView.getX() - 1);
                }
            });
        i--;

        Thread.sleep(1000);
        //Add exception catching code
      }
}.start();

此外,1000毫秒的延迟不是很平滑。尝试更快一点。