自定义View之自动刷新View

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 自定义View之自动刷新View,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述
不断刷新界面。界面绘制通过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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134131.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!