在Android中,每秒钟逐像素移动textview

在Android中,每秒钟逐像素移动textview,android,textview,runnable,Android,Textview,Runnable,我的Android应用程序中有一个文本视图。我想每秒钟逐像素移动一次TextView。我正在使用setX方法来移动textView。如果我使用一个按钮并单击它,它工作得很好。每次单击textview都会移动,但当我尝试使用带有处理程序的循环自动执行时,它不会平稳移动,它会毫不延迟地冲向屏幕左侧。这是我正在使用的代码 int i = (int) txtView.getX(); while (i>0) { final Handler handle

我的Android应用程序中有一个文本视图。我想每秒钟逐像素移动一次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--;
  }

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

也许你可以做这样的事

      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);
            }
        }
使用这个类

 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;
    }
}

我使用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);
    }
}
私有类任务扩展异步任务{
私有按钮mMyButton;
公共任务(按钮myButton){
mMyButton=myButton;
}
@凌驾
受保护的Void doInBackground(Void…参数){
尝试
{
睡眠(1000);
}
捕捉(中断异常e)
{
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void v)
{
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();
}
int像素=50;
按钮myButton=(按钮)findViewById(R.id.button1);
用于(int i=0;i

当然,您可以随意更改按钮。

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

在代码中添加实际调用之间的延迟。大致代码如下:

//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毫秒的延迟也不是很平稳。快一点试试。

为什么他需要一个循环。他可以使用延迟1秒的处理器或计时器,对吗?@Raghunandan我没有使用任何循环。。答案只是一个建议:)。请给我提个好建议。好啊我误解了,因为我使用的变量是完美的答案。非常感谢。
int pixels = 50;
Button myButton = (Button) findViewById(R.id.button1);
for( int i = 0; i < pixels; ++i) {
    new Task(myButton).execute();
}
//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();