在Android中,每秒钟逐像素移动textview
我的Android应用程序中有一个文本视图。我想每秒钟逐像素移动一次TextView。我正在使用setX方法来移动textView。如果我使用一个按钮并单击它,它工作得很好。每次单击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
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();