【问题标题】:Android Custom View with Handler带有处理程序的 Android 自定义视图
【发布时间】:2012-10-14 18:19:18
【问题描述】:

我正在寻找一种在 Android 中为自定义视图设置动画的简单方法。我试图避免使用 animator 对象,但想使用原始线程。我所做的是通过创建一个扩展 android.view.View 的类来创建一个自定义视图。然后我重写 onDraw 方法并使用画布绘制一个矩形。我想要缩小的矩形,所以我保留一个代表矩形右侧的 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;
    }

}

【问题讨论】:

    标签: android multithreading animation view


    【解决方案1】:

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

    Handler mHandler = new Handler();
    

    然后,从您的线程中调用:

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

    【讨论】:

    • 这就是我要找的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2012-03-28
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多