Android SurfaceView

2023-11-19

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


代码:

Activity

  1. package com.view;  
  2.    
  3.  import android.app.Activity;  
  4.  import android.os.Bundle;  
  5.  import android.view.Window;  
  6.  import android.view.WindowManager;  
  7.    
  8.  public class MainActivity extends Activity {  
  9.      /** Called when the activity is first created. */  
  10.      @Override  
  11.      public void onCreate(Bundle savedInstanceState) {  
  12.          super.onCreate(savedInstanceState);  
  13.    
  14.          // 隐藏状态栏  
  15.          this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  16.                  WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  17.    
  18.          // 把Activity的标题去掉  
  19.          requestWindowFeature(Window.FEATURE_NO_TITLE);  
  20.    
  21.          // 设置布局  
  22.          this.setContentView(new MySurfaceView(this));  
  23.      }  
  24.  }  
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

  1. package com.view;  
  2.    
  3.  import android.content.Context;  
  4.  import android.graphics.Canvas;  
  5.  import android.graphics.Color;  
  6.  import android.graphics.Paint;  
  7.  import android.view.KeyEvent;  
  8.  import android.view.MotionEvent;  
  9.  import android.view.SurfaceHolder;  
  10.  import android.view.SurfaceHolder.Callback;  
  11.  import android.view.SurfaceView;  
  12.    
  13.  public class MySurfaceView extends SurfaceView implements Runnable, Callback {  
  14.    
  15.      private SurfaceHolder mHolder; // 用于控制SurfaceView  
  16.    
  17.      private Thread t; // 声明一条线程  
  18.    
  19.      private boolean flag; // 线程运行的标识,用于控制线程  
  20.    
  21.      private Canvas mCanvas; // 声明一张画布  
  22.    
  23.      private Paint p; // 声明一支画笔  
  24.    
  25.      private int x = 50, y = 50, r = 10// 圆的坐标和半径  
  26.    
  27.      public MySurfaceView(Context context) {  
  28.          super(context);  
  29.    
  30.          mHolder = getHolder(); // 获得SurfaceHolder对象  
  31.          mHolder.addCallback(this); // 为SurfaceView添加状态监听  
  32.          p = new Paint(); // 创建一个画笔对象  
  33.          p.setColor(Color.WHITE); // 设置画笔的颜色为白色  
  34.          setFocusable(true); // 设置焦点  
  35.      }  
  36.    
  37.      /** 
  38.       * 自定义一个方法,在画布上画一个圆 
  39.       */  
  40.      public void Draw() {  
  41.          mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画  
  42.          mCanvas.drawRGB(000); // 把画布填充为黑色  
  43.          mCanvas.drawCircle(x, y, r, p); // 画一个圆  
  44.          mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上  
  45.      }  
  46.    
  47.      /** 
  48.       * 当SurfaceView创建的时候,调用此函数 
  49.       */  
  50.      @Override  
  51.      public void surfaceCreated(SurfaceHolder holder) {  
  52.          t = new Thread(this); // 创建一个线程对象  
  53.          flag = true// 把线程运行的标识设置成true  
  54.          t.start(); // 启动线程  
  55.      }  
  56.    
  57.      /** 
  58.       * 当SurfaceView的视图发生改变的时候,调用此函数 
  59.       */  
  60.      @Override  
  61.      public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  62.              int height) {  
  63.      }  
  64.    
  65.      /** 
  66.       * 当SurfaceView销毁的时候,调用此函数 
  67.       */  
  68.      @Override  
  69.      public void surfaceDestroyed(SurfaceHolder holder) {  
  70.          flag = false// 把线程运行的标识设置成false  
  71.      }  
  72.    
  73.      /** 
  74.       * 当屏幕被触摸时调用 
  75.       */  
  76.      @Override  
  77.      public boolean onTouchEvent(MotionEvent event) {  
  78.          x = (int) event.getX(); // 获得屏幕被触摸时对应的X轴坐标  
  79.          y = (int) event.getY(); // 获得屏幕被触摸时对应的Y轴坐标  
  80.          return true;  
  81.      }  
  82.        
  83.      /** 
  84.       * 当用户按键时调用 
  85.       */  
  86.      @Override  
  87.      public boolean onKeyDown(int keyCode, KeyEvent event) {  
  88.          if(keyCode == KeyEvent.KEYCODE_DPAD_UP){    //当用户点击↑键时  
  89.              y--;    //设置Y轴坐标减1  
  90.          }  
  91.          return super.onKeyDown(keyCode, event);  
  92.      }  
  93.    
  94.      @Override  
  95.      public void run() {  
  96.          while (flag) {  
  97.              Draw(); // 调用自定义画画方法  
  98.              try {  
  99.                  Thread.sleep(50); // 让线程休息50毫秒  
  100.              } catch (InterruptedException e) {  
  101.                  e.printStackTrace();  
  102.              }  
  103.          }  
  104.      }  
  105.    
  106.  }  
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)方法来,详细的在代码里已注释。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android SurfaceView 的相关文章

  • android.app包---------ActivityManager类介绍

    ActivityManager类介绍 ActivityManager与系统与所有正在运行Activity进行交互 相关方法介绍 getDeviceConfigurationInfo 获取设备配置属性值 getMemoryClass 返回当前
  • 使用fastboot工具刷入recovery.img、boot.img、system.img等

    下载解压 fastboot工具 解压FastBoot工具 zip 将解压得到的 FastBoot文件夹复制到任意盘如 D盘 将要刷入手机的recovery img recovery img等放到FastBoot文件夹 安装好手机型号对应的U
  • Android 3D滑动菜单完全解析,实现推拉门式的立体特效

    转载请注明出处 http blog csdn net guolin blog article details 10471245 在上一篇文章中 我们学习了Camera的基本用法 并借助它们编写了一个例子 实现了类似于API Demos里的图
  • UncaughtExceptionHandler示例使用

    概述 UncaughtExceptionHandler是用来catch线程内的没有被捕获到的exception 可以在uncaughtException方法中对这些异常进行统一处理 用法 UncaughtExceptionHandler是一
  • Android RecycleView列表使用GridLayoutManager 均分子项Item,且左右宽度相同

    1 需求描述 列表分为一列两个 两个子项宽度一致 且左右边距一样 就是要好看 子项宽度适配手机 高度适配宽度 2 问题描述 但是我们直接设置的时候 他的子项会在给他的布局的左边 于是我想到了设置下子项的左右边距 但是android手机屏幕太
  • android.accounts包

    包 android accounts 英文原文 http developer android com reference android accounts package summary html 版本 Android 4 0 r1 译者署
  • Android数据库安全解决方案,使用SQLCipher进行加解密

    转载请注明出处 http blog csdn net guolin blog article details 11952409 我们都知道 Android系统内置了SQLite数据库 并且提供了一整套的API用于对数据库进行增删改查操作 数
  • Java中的四种引用

    Java中存在四种引用 它们分别是 1 强引用 StrongReference 强引用是使用最普遍的引用 如果一个对象具有强引用 那垃圾回收器绝不会回收它 当内存空间不足 Java虚拟机宁愿抛出OutOfMemoryError错误 使程序异
  • Android res文件夹下资源定义及使用

    1 颜色 RGB ARGB RRGGBB AARRGGBB 颜色资源应该位于
  • Java中String类的isEmpty方法、null以及""的区别

    一直以来对String的这三个空挺晕的 刚好同事问我 我也学习下 从别人博客上看到的是这样的 isEmpty 分配了内存空间 值为空 是绝对的空 是一种有值 值 空 分配了内存空间 值为空字符串 是相对的空 是一种有值 值 空字串 null
  • android 日期控件

    相关布局文件
  • Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

    转载请注明出处 http blog csdn net guolin blog article details 9255575 最近项目中需要用到ListView下拉刷新的功能 一开始想图省事 在网上直接找一个现成的 可是尝试了网上多个版本的
  • android.content包-----ClipboardManager

    ClipboardManager类介绍 Clipboardmanager类通过getSystemService String 方法进行实例化操作 ClipboardManger类的相关方法很简单 包含set和get剪切板的数据 剪切板的数据
  • WebView 加载不出网页,一片空白

    今天在项目上加载网页时 发现一只加载不出来 emmm 就看了下以往的项目 发现遗漏的地方不止一点哦 在此做个总结 1 权限配置 确保在 AndroidManifest xml 文件中添加了网络权限
  • android获取string.xml的值

    为什么需要把应用中出现的文字单独存放在string xml文件中呢 一 是为了国际化 当需要国际化时 只需要再提供一个string xml文件 把里面的汉子信息都修改为对应的语言 如 English 再运行程序时 android操作系统会根
  • Android Studio如何添加工程(project)为library(针对非gradle)

    这篇文章还是针对非gradle build的工程 gradle build有一些差别 在Eclipse要引用别的工程为本工程的library很简单 但是在Android Studio还是稍稍有点小复杂的 那如何引用别的工程为本工程的libr
  • Android SurfaceView

    下面就贴上一个小程序代码 主要运用SurfaceView来实现在屏幕上画一个圆 你可以通过按方向键和触摸屏幕来改变圆的位置 代码 Activity java view plain copy print package com view im
  • android.accessibilityservice包介绍

    android accessibilityservice 英文原文 http developer android com reference android accessibilityservice package summary html
  • 转载的开源干货

    android相关 第三方库 awesome android ui 大量 Android UI UX 库 大城小黄 recyclerview animators 一个关于RecyclerView items的动画库 一个简单的Recycle
  • ANDROID版本号和版本名称的重要性介绍

    转载请注明出处http blog csdn net y150481863 article details 41249159 来自 http blog csdn net y150481863 当我们在刚开始学习ANDROID的时候 可能不会过

随机推荐

  • leetcode 查找

    解法1 直接使用STL class Solution public vector
  • 使用QSettings保存QT应用程序数据

    使用QSettings保存QT应用程序数据 简介 QSettings类提供了持久的跨平台应用程序设置 这些settings一般都是存在系统里的 比如windows一般都写在系统注册表或者写INI文件 mac系统一般都在XML文件里 那么按照
  • 如何创建项目

    1 MvvmLight框架的引用 引用 头部选项卡的 工具栏 NuGet 包管理器 管理解决方案的NuGet 程序包 搜索 MVVM Light MvvmLight 作者 Laurent Bugnion GalaSoft 勾选项目 Do n
  • Vue2组件封装 Vue组件封装

    写在前面 虽然是Vue2组件封装 主要的内容是记录一下我对封装组件的一些要点和我的看法 原学习视频来源于b站黑马从0到1封装组件库 什么是组件 都说Vue是组件化开发 确实有道理 别说按钮输入框这种组件了 就连每个页面 从本质来看也是一个个
  • 电源学习总结(六)——BUCK设计

    降压型开关电源 BUCK 是实际应用中较为广泛使用的电路 本文来详细说一说相关的设计细节 这里不考虑集成的开关电源 分控制和驱动 开关管 电感等部分讲 文章目录 基本结构 控制和驱动 开关管 自举电容 电感 电容 工作频率选择 其他注意事项
  • new做了哪些事?

    new做了哪些事 function Parent this name Person const p new Parent 创建一个空对象 将对象的原型 proto 指向构造函数的prototype原型对象 将构造函数的this指向当前对象
  • 使用xshell-ssh连接服务器,报错:Xshell Socket error Event: 32 Error: 10053

    XShell连接CentOS系统时 报出Xshell Socket error Event 32 Error 10053 错误 有点烦人 操作 用SSH工具连接linux电脑出现的问题 Read from socket failed Con
  • 多益网络_网络安全的未来日益激烈的信息控制之战

    多益网络 Over two decades ago Alphabet CEO Eric Schmidt noted The Internet is the first thing that humanity has built that h
  • 内核虚拟化KVM/QEMU——guest os,qemu,kvm的运行流程

    内核虚拟化KVM QEMU guest os qemu kvm的运行流程 这里主要介绍基于x86平台的Guest Os Qemu Kvm工作流程 如图 通过KVM APIs可以将qemu的command传递到kvm 1 创建VM syste
  • 问题 对于二分类问题,当训练集中正负样本非常不均衡时,如何处理数据以更好 地训练分类模型?

    为什么很多分类模型在训练数据不均衡会出现问题 本质原因是模型在训练时优化的目标函数和人们测试时使用的评价标准不一致 这种不一致可能是训练数据的样本分布和测试数据的不一致 例如训练时优化的整个训练集 正负比例1 99 的正确率 而测试的时候期
  • JavaScript [数组去重] 的部分方法总结

    参考了文章 JavaScript数组去重 12种方法 史上最全 有部分改动 删去了一些没用的代码 替换了部分for循环 一 利用ES6 Set去重 ES6中最常用 function arrayRemoveSame arr return Ar
  • 二手房各项税费计算公式

    北京的房屋类型有很多种 有商品房 公房 一类经适房 二类经适房 两限房 现针对这些类型的房子列一下二手房购置过程中 需要考虑的税费 一 各类房源简介 1 商品房 正规从售楼处买的房源 2 公房 单位分的房子 由于不知道原值 所以个税按 网签
  • sbrk/brk函数用法

    头文件unistd h sbrk brk函数重新指定数据段的结束位置 sbrk 0 获得当前数据段结束地址 sbrk 增量 增量可正 可负 可为0 都返回原来数据段的结束地址 失败返回 1 brk 地址 返回0或 1 通过重新指定数据段新的
  • Matlab导入Excel数据快速绘图

    现在使用Matalb绘图越来越多 不会这个绘图技能感觉都要被时代抛弃了 所以 本文主要是介绍怎么用Matlab导入Excel数据快速绘图 目录 一 基本使用 二 细致调节 1 颜色选项 2 形状选项 3 网格线选项 一 基本使用 事先 建议
  • Python爬虫进阶--js逆向

    目标网址 aHR0cHM6Ly93d3cuZG5zLmNvbS9sb2dpbi5odG1s 抓包定位 首先抓包看请求 这里 password 和 email 都经过加密了 token 可以在页面上找到 从这里进去搜索 直接搜索 passwo
  • 【赠书活动|第六期《强化学习:原理与Python实战》】

    文章目录 RLHF是什么 RLHF适用于哪些任务 RLHF和其他构建奖励模型的方法相比有何优劣 什么样的人类反馈才是好的反馈 RLHF算法有哪些类别 各有什么优缺点 RLHF采用人类反馈会带来哪些局限 如何降低人类反馈带来的负面影响 图书简
  • 打卡C语言学习第十三天

    对之前所学内容复习和补充 练习函数书写
  • ruoyi登录流程

    首先加载登录界面会发送验证码请求和获取Cookie 会调用created函数 Getcode是获取验证码 GetCookie是获取cookie GetCodeImg函数会调用ajax发送请求给后端 后端GetMapping接口接收到请求后执
  • 搜狐2012.9.15校园招聘会笔试题

    一 不定项选择题 1 以下程序的打印结果是 include
  • Android SurfaceView

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