当前位置: 首页 > news >正文

Android SurfaceView

下面就贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置


代码:

Activity

package com.view; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 隐藏状态栏 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 把Activity的标题去掉 requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置布局 this.setContentView(new MySurfaceView(this)); } }

SurfaceView

package com.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; public class MySurfaceView extends SurfaceView implements Runnable, Callback { private SurfaceHolder mHolder; // 用于控制SurfaceView private Thread t; // 声明一条线程 private boolean flag; // 线程运行的标识,用于控制线程 private Canvas mCanvas; // 声明一张画布 private Paint p; // 声明一支画笔 private int x = 50, y = 50, r = 10; // 圆的坐标和半径 public MySurfaceView(Context context) { super(context); mHolder = getHolder(); // 获得SurfaceHolder对象 mHolder.addCallback(this); // 为SurfaceView添加状态监听 p = new Paint(); // 创建一个画笔对象 p.setColor(Color.WHITE); // 设置画笔的颜色为白色 setFocusable(true); // 设置焦点 } /** * 自定义一个方法,在画布上画一个圆 */ public void Draw() { mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画 mCanvas.drawRGB(0, 0, 0); // 把画布填充为黑色 mCanvas.drawCircle(x, y, r, p); // 画一个圆 mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上 } /** * 当SurfaceView创建的时候,调用此函数 */ @Override public void surfaceCreated(SurfaceHolder holder) { t = new Thread(this); // 创建一个线程对象 flag = true; // 把线程运行的标识设置成true t.start(); // 启动线程 } /** * 当SurfaceView的视图发生改变的时候,调用此函数 */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } /** * 当SurfaceView销毁的时候,调用此函数 */ @Override public void surfaceDestroyed(SurfaceHolder holder) { flag = false; // 把线程运行的标识设置成false } /** * 当屏幕被触摸时调用 */ @Override public boolean onTouchEvent(MotionEvent event) { x = (int) event.getX(); // 获得屏幕被触摸时对应的X轴坐标 y = (int) event.getY(); // 获得屏幕被触摸时对应的Y轴坐标 return true; } /** * 当用户按键时调用 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_DPAD_UP){ //当用户点击↑键时 y--; //设置Y轴坐标减1 } return super.onKeyDown(keyCode, event); } @Override public void run() { while (flag) { Draw(); // 调用自定义画画方法 try { Thread.sleep(50); // 让线程休息50毫秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }
MySurfaceView首先继承SurfaceView,然后实现Runnable和Callback接口

重写了Runnable的run方法和Callback的surfaceCreated(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width,int height),surfaceDestroyed(SurfaceHolder holder)方法,

还实现了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法来,详细的在代码里已注释。






相关文章:

  • 明晰Silverlight中的依赖属性
  • rc.local自启动学习
  • Qt游戏编程_02
  • 超级终端使用简介
  • 粘包、丢包及TCP信息收发
  • 超前引用
  • Java中的volatile关键字-转载
  • jsp---EL存取器
  • 如何可以导入注册表文件时不提示?
  • 第八章异常和断言
  • VC++播放音频文件和音频数据的方法
  • ubuntu ftp服务器配置(转)
  • shell算数运算
  • 集线器、路由器、交换机、第三层交换技术
  • Slideshow ad
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 10个最佳ES6特性 ES7与ES8的特性
  • Android开源项目规范总结
  • ES6系列(二)变量的解构赋值
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • jQuery(一)
  • npx命令介绍
  • React-flux杂记
  • ReactNativeweexDeviceOne对比
  • 初识 beanstalkd
  • 创建一种深思熟虑的文化
  • 判断客户端类型,Android,iOS,PC
  • 微信公众号开发小记——5.python微信红包
  • 移动端解决方案学习记录
  • 原生 js 实现移动端 Touch 滑动反弹
  • Linux权限管理(week1_day5)--技术流ken
  • 从如何停掉 Promise 链说起
  • 第二十章:异步和文件I/O.(二十三)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Java)【深基9.例1】选举学生会
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)c52学习之旅-简单了解单片机
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)VirtualBox安装增强功能
  • (转)Linq学习笔记
  • (转载)深入super,看Python如何解决钻石继承难题
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • :not(:first-child)和:not(:last-child)的用法
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [android] 请求码和结果码的作用
  • [C++]C++入门--引用
  • [C++]类和对象【上篇】
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现