1

我的 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--;
  }
4

5 回答 5

2

因为您正在设置没有任何交易的 posDelayed 操作。您正在设置执行可运行之前的延迟。但是您的 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);
            }
        }
于 2013-06-03T11:22:15.273 回答
0
int i = (int) txtView.getX();    
while (i>0)
{
    txtView.setX((int) txtView.getX() - 1);
    Thread.sleep(1000);
    i--;
}
于 2013-06-03T11:25:51.477 回答
0

您的代码在实际循环中没有延迟。因此,一秒钟后,您发布到 Handler 的所有 Runnable 将立即按顺序执行。

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

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

于 2013-06-03T11:49:40.930 回答
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);
于 2013-06-03T11:31:57.593 回答
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 更改为您喜欢的任何内容。

于 2013-06-03T11:43:42.997 回答