Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带处理程序的Android自定义视图_Android_Multithreading_Animation_View - Fatal编程技术网

带处理程序的Android自定义视图

带处理程序的Android自定义视图,android,multithreading,animation,view,Android,Multithreading,Animation,View,我正在寻找一种简单的方法来在Android中设置自定义视图的动画。我试图避免使用animator对象,但希望使用原始线程。我所做的是通过创建一个扩展了android.view.view的类来创建一个自定义视图。然后我重写了onDraw方法,并使用画布绘制一个rect。我希望矩形收缩,所以我保留了一个变量,表示矩形右侧的x值。然后我希望矩形的右边缘随时间收缩。我想做的是创建一个新线程,启动它并让它更改矩形的值。除非调用view.invalidate,否则除视图之外的所有功能都不会得到更新。问题是我

我正在寻找一种简单的方法来在Android中设置自定义视图的动画。我试图避免使用animator对象,但希望使用原始线程。我所做的是通过创建一个扩展了android.view.view的类来创建一个自定义视图。然后我重写了onDraw方法,并使用画布绘制一个rect。我希望矩形收缩,所以我保留了一个变量,表示矩形右侧的x值。然后我希望矩形的右边缘随时间收缩。我想做的是创建一个新线程,启动它并让它更改矩形的值。除非调用view.invalidate,否则除视图之外的所有功能都不会得到更新。问题是我不能从生成的线程调用它,因为它不是UI线程。我阅读了关于使用处理程序的解决方案。。。但我仍然不确定这是否是正确的解决方案,以及如何使用它们

package com.example.practicum;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;

public class TimerControl extends View implements Runnable, Handler.Callback
{
    private Paint paint;
    private Rect rect;
    private Thread t;
    private Handler h;

    public TimerControl(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        // TODO Auto-generated constructor stub



        paint = new Paint();
        paint.setColor(Color.BLUE);
        rect = new Rect(0,0,60,60);
        t = new Thread(this);
        t.start();


        h = new Handler(this);
        //h.post(this);
    }

    @Override
    public void onDraw(Canvas canvas)
    {
        canvas.drawRect(rect, paint);
    }

    @Override
    public void run()
    {
        rect.right = rect.right-1;
        while(true)
        {
            rect.right = rect.right-1;
            this.invalidate();
            try
            {
                Thread.sleep(5000);
                h.sendEmptyMessage(0);
            } 
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    @Override
    public boolean handleMessage(Message msg)
    {

        return false;
    }

}

您可以定义全局处理程序(在UI线程中):

然后,从线程中调用:

mHandler.post(new Runnable() {
    public void run() {             
        // call some method on the UI thread
    }
});

这就是我要找的!谢谢
mHandler.post(new Runnable() {
    public void run() {             
        // call some method on the UI thread
    }
});