自定义View之自动刷新View

您所在的位置:网站首页 关于view的刷新invalidate 自定义View之自动刷新View

自定义View之自动刷新View

2023-10-28 01:18| 来源: 网络整理| 查看: 265

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3