自定义View之自动刷新View

在这里插入图片描述
不断刷新界面。界面绘制通过onDraw方法实现,界面刷新通过android提供的两种方法,一种是invalidate方法需要和handler一起用,postInvalidate()方法实现在线程中刷新界面。
Invalidate 刷新不安全而在postinvalidate则较为简单而且不需要配合Handler。
下面我们来看代码
RefreshActivity

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.view.KeyEvent;
import android.view.MotionEvent;

/**
 * Created by Kevein on 2019/3/23.19:38
 * 自定义自动刷新view
 */

public class RefreshActivity extends Activity {
	static final int handrlerMsg = 0x001;
	private ViewDrawer myView = null;
	private Context mContext = this;
	@Override
	protected void onCreate(@Nullable Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//实例化对象
		this.myView = new ViewDrawer(this);
		//设置显示我们自定义的View
		setContentView(myView);
		//开启线程
		new Thread(new RefreshThread(this)).start();

	}
	/**
	 * 监听Back键按下事件,方法1:
	 * 注意:
	 * super.onBackPressed()会自动调用finish()方法,关闭
	 * 当前Activity.
	 * 若要屏蔽Back键盘,注释该行代码即可
	 */
/*	@Override
	public void onBackPressed() {
		super.onBackPressed();
		System.out.println("按下了back键   onBackPressed()");
	}*/


	// 等待消息并处理
	Handler myHandler = new Handler()
	{
		public void handleMessage(Message msg)
		{
			switch (msg.what)
			{
				case RefreshActivity.handrlerMsg:
					myView.invalidate();
					break;
			}
			super.handleMessage(msg);
		}
	};
	/**
	 * 可以将GameThread类这样写 同样可以更新界面,并且不在需要 Handler在接受消息 class GameThread
	 * implements Runnable { public void run() { while
	 * (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100); }
	 * catch (InterruptedException e) { Thread.currentThread().interrupt(); }
	 * //使用postInvalidate可以直接在线程中更新界面 mGameView.postInvalidate(); } } }
	 */
	public boolean onTouchEvent(MotionEvent event)
	{
		return true;
	}

	// 按键按下事件
	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		if ((keyCode == KeyEvent.KEYCODE_BACK)) {
			System.out.println("按下了back键   onKeyDown()");
			return false;
		}else {
			return super.onKeyDown(keyCode, event);
		}
	}

	// 按键弹起事件
	public boolean onKeyUp(int keyCode, KeyEvent event)
	{
		switch (keyCode)
		{
			// 上方向键
			case KeyEvent.KEYCODE_DPAD_UP:
				myView.y -= 3;
				break;
			// 下方向键
			case KeyEvent.KEYCODE_DPAD_DOWN:
				myView.y += 3;
				break;
		}
		return false;
	}

	public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
	{
		return true;
	}
}

RefreshThread

package com.example.cxc.bitmapt;

import android.app.Activity;
import android.os.Message;
/**
 * Created by Kevein on 2019/3/23.19:37
 */
//刷新线程
 class RefreshThread implements Runnable {
	private final RefreshActivity mRefreshActivity;

	RefreshThread(RefreshActivity refreshActivity)
	{
		mRefreshActivity = refreshActivity;
	}
	@Override
	public void run() {
		while (!Thread.currentThread().isInterrupted())
		{
			Message message = new Message();
			message.what = RefreshActivity.handrlerMsg;

			mRefreshActivity.myHandler.sendMessage(message);
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException e)
			{
				Thread.currentThread().interrupt();
			}
		}
	}
}

ViewDrawer

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

/**
 * Created by Kevein on 2019/3/23.18:38
 */
//界面View绘制
public class ViewDrawer extends View
{

	int  colorSwitch = 0;
	int  y = 300;
	public ViewDrawer(Context context) {
		super(context);
	}
	public void onDraw(Canvas canvas)
	{
		if(colorSwitch < 100)
		{
			colorSwitch++;
		}
		//绘图
		Paint mPaint = new Paint();
		switch (colorSwitch % 4)
		{
			case 0:
				mPaint.setColor(Color.BLUE);
				break;
			case 1:
				mPaint.setColor(Color.GREEN);
				break;
			case 2:
				mPaint.setColor(Color.RED);
				break;
			case 3:
				mPaint.setColor(Color.YELLOW);
				break;
			case 4:
				mPaint.setColor(Color.GREEN);
				break;
			case 5:
				mPaint.setColor(Color.CYAN);
				break;
				default:mPaint.setColor(Color.BLACK);
				break;

		}//矩形绘制
		canvas.drawRect((320-80)/2,y,(320-80)+80,y+40,mPaint);
	}
}

项目GIthub地址:https://github.com/307572384/Bitmapt

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

轻烟飘荡

我想吃甜筒

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

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

打赏作者

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

抵扣说明:

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

余额充值