Android使用handler和Runnable结合,自定义View更新UI的Demo

来源:互联网 发布:网络剧 有毒 全集 编辑:程序博客网 时间:2024/06/07 07:50

前三周在修改android4.2锁屏UI,刚做android好多知识不会啊,里面有个动画效果是一个箭头向下来回跑动。看了网上的一些知识,好像可以用Frame动画实现。。可惜不会。后来,又看到说用新Thread来更新UI,然后自己尝试做了个Demo。源码如下:

MyView.java:

package com.example.handlerupdateuidemo;import android.content.Context;import android.content.res.Resources;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.Log;import android.view.View;public class MyView extends View {    private int mimageId = R.drawable.hys_ic_lockscreen_arrow_ani_1;    private Thread myThread;    Paint myPaint;        public MyView(Context context) {           super(context);                  }           public MyView(Context context,AttributeSet attrs) {        super(context);        // TODO Auto-generated constructor stub        myPaint = new Paint();        myThread = new Thread(new handlerDrawableUpdateRunnable());        myThread.start();    }    @Override    protected void onDraw(Canvas canvas) {        // TODO Auto-generated method stub        myPaint.setAntiAlias(true);        Resources res=getResources();        Log.e("updateHandler", "onDraw mimageId == " + mimageId);        //Drawable drawable=res.getDrawable(mimageId);        canvas.drawBitmap(BitmapFactory.decodeResource(res,mimageId),200,200,myPaint);        super.onDraw(canvas);    }    private static final int MSG_UPDATE_DRAWABLE = 0x101;    private static int images[] = {            R.drawable.hys_ic_lockscreen_arrow_ani_1,            R.drawable.hys_ic_lockscreen_arrow_ani_2,            R.drawable.hys_ic_lockscreen_arrow_ani_3,            R.drawable.hys_ic_lockscreen_arrow_ani_4,            R.drawable.hys_ic_lockscreen_arrow_ani_5,            R.drawable.hys_ic_lockscreen_arrow_ani_6 };    //private Thread updateThread;        class handlerDrawableUpdateRunnable implements Runnable {        public void run() {            while (!Thread.currentThread().isInterrupted()) {                for (int i = 0; i < images.length - 1; i++) {                    Message msg = updateHandler.obtainMessage();                    msg.what = MSG_UPDATE_DRAWABLE;                    Bundle b = new Bundle();                    try {                        Thread.sleep(200);                        b.putInt("imgId", images[i]);                        msg.setData(b);                        updateHandler.sendMessage(msg);                    } catch (Exception e) {                        e.printStackTrace();                    }                    if (i >= images.length - 1) {                        i = 0;                    }                }            }        }    }    Handler updateHandler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {            case MSG_UPDATE_DRAWABLE:                Bundle b = msg.getData();                int imageId = b.getInt("imgId");                if(imageId <= 0){                    Log.e("updateHandler", "updateHandler imageId == " + imageId);                    return;                }                                mimageId = imageId;                invalidate();                break;            default:                break;            }            super.handleMessage(msg);        }    };}

添加的资源图片:


然后在布局文件activity_main.xml中添加

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <com.example.handlerupdateuidemo.MyView        android:id="@+id/myview"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>

最后一个Demo诞生了。。。对于一个菜鸟来说还是挺有成就感的。。

留下的疑问:

1.一个像上述这样的线程如果不主动停止,那它什么条件下会自己停止呢?

2.一个像上述这样的线程如果不主动停止,占用的资源多不多啊?

有路过的大神帮忙解答,谢谢了

0 0