我的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--;
}
答案 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毫秒的延迟不是很平滑。尝试更快一点。