深入Android架构(从线程到AIDL)_15 应用Android的UI框架02

3、 使用UI线程的MQ(Message Queue)

// myView.java
// ………
public class myView extends View {
    // ………
    @Override 
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // ………
        // canvas.drawRect(….);
        invalidate();
    }
}
  • 我们可以透过Message方式来触发UI线程去調用invalidate()函数,而达到重新执行onDraw()来进行重复绘图和刷新画面的动作。

       

// myView.java
//……..
public class myView extends View {
    private Paint paint= new Paint();
    private int line_x = 100, int line_y = 100;
    private float count = 0;
    private myHandler h;

    myView(Context ctx)
    { 
        super(ctx);
        h = new myHandler();
    }

    @Override 
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if( count > 12) count = 0;
        int x = (int) (75.0 * Math.cos(2*Math.PI * count/12.0));
        int y = (int) (75.0 * Math.sin(2*Math.PI * count/12.0));
        count++;
        canvas.drawColor(Color.WHITE);
        paint.setColor(Color.RED);
        paint.setStrokeWidth(3);
        canvas.drawLine(line_x, line_y, line_x+x, line_y+y, paint);
        paint.setStrokeWidth(2);
        paint.setColor(Color.BLUE);

        canvas.drawRect(line_x-5, line_y - 5, line_x+5, line_y + 5, paint);
        paint.setColor(Color.YELLOW);
        canvas.drawRect(line_x-3, line_y - 3, line_x+3, line_y + 3, paint);
        h.removeMessages(0);
        Message msg = h.obtainMessage(0);
        h.sendMessageDelayed(msg, 1000);
    }

    class myHandler extends Handler {
        @Override 
        public void handleMessage(Message msg) {
            invalidate();
        }
    };
}
  • 使用sendMessageDelayed()函数来暂停一下,延迟数秒钟才传递 Message给UI线程。
     

 4、 诞生一个小线程担任游戏线程

  • 刚才是由UI线程来丢Message到自己的MQ里;也就是UI线程丢Message给自己。同一样地,也可以由其它线程来丢Message到UI线程的MQ里,来触发UI线程去調用invalidate()函数。
    // myView.java
    // ……….
    public class myView extends View {
        private Paint paint= new Paint();
        private int line_x = 100, line_y = 100;
        private float count = 0;
        private myHandler h;
        myView(Context ctx) { super(ctx); h = new myHandler(); }
    
        @Override 
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if( count > 12) count = 0;
            int x = (int) (75.0 * Math.cos(2*Math.PI * count/12.0));
            int y = (int) (75.0 * Math.sin(2*Math.PI * count/12.0));
            count++;
    
            canvas.drawColor(Color.WHITE);
            paint.setColor(Color.RED);
            paint.setStrokeWidth(3);
            canvas.drawLine(line_x, line_y, line_x+x, line_y+y, paint);
            paint.setStrokeWidth(2);
            paint.setColor(Color.BLUE);
            canvas.drawRect(line_x-5, line_y - 5, line_x+5, line_y + 5, paint);
            paint.setColor(Color.MAGENTA);
            canvas.drawRect(line_x-3, line_y - 3, line_x+3, line_y + 3, paint);
            //--------------------------------
            myThread t = new myThread();
            t.start();
        }
    
        // 诞生一个小线程,担任游戏线程,负责回圈控制
        class myThread extends Thread{
            public void run() {
                h.removeMessages(0);
                Message msg = h.obtainMessage(0);
                h.sendMessageDelayed(msg, 1000);
            }
        };
    
        class myHandler extends Handler {
            @Override 
            public void handleMessage(Message msg) {
                invalidate(); // call onDraw()
            }
        };
    }

  • UI线程诞生一个小线程,并且由该小线程去执行myThread类别里的run()函数。接着,这新线程执行到指令: 

            h.removeMessages(0);
            Message msg = h.obtainMessage(0);
            h.sendMessageDelayed(msg, 1000);

  • 延迟数秒钟才传递 Message给UI线程(丢入UI线程的MQ里)。
  • 当UI线程发现MQ有个Message,就去执行myHandler类别里的handleMessage()函数。就触发UI线程去調用invalidate()函数了。
     

5、 小线程(非UI线程)調用postInvalidate()

刚才的小线程传递Message给UI线程(丢入UI线程的MQ里),触发UI线程去調用invalidate()函数。 Android提供一个postInvalidate()函数来替代上述的动作。由小线程直接去調用postInvalidate()函数,就能间接触发UI线程去調用invalidate()函数了。

// myView.java
//……
public class myView extends View {
    //……….
    @Override 
    protected void onDraw(Canvas canvas) {
        //…………..
        myThread t = new myThread();
        t.start();
    }

    class myThread extends Thread{
        public void run() {
        postInvalidateDelayed(1000);
    }};
}
  • 由小线程直接去調用postInvalidate()函数;就相当于,由小线程传递Message给UI线程,触发UI线程去調用invalidate()函数。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思忖小下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值