不断刷新界面。界面绘制通过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