热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android中SurfaceView用法简单实例

这篇文章主要介绍了Android中SurfaceView用法,以一个简单的图形绘制及改变位置实现方法分析了SurfaceView的使用技巧,需要的朋友可以参考下

本文实例讲述了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)方法来,详细的在代码里已注释。

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 题库来源:安全生产模拟考试一点通公众号小程序G3锅炉水处理报名考试是安全生产模拟考试一点通生成的,G3锅炉水处理证模拟考试题库是根据G3锅炉水处理最新 ... [详细]
  • 本文探讨了在开发测绘小程序时,如何利用面向对象编程思想实现附合水准路线平差。该方法通过测站和实测高差数据,计算高差改正数及未知点高程。文中介绍了点类和线类的设计,并详细描述了具体的计算步骤与逻辑。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 南方CASS专题系列:全面教程、视频讲解与插件汇总
    本专题系列涵盖南方CASS的完整教程、详细视频讲解及实用插件,旨在帮助用户快速掌握该软件。南方CASS基于CAD平台开发,集成了地形图绘制、地籍管理、空间数据建库、工程应用和土石方计算等多项功能,广泛应用于测绘、工程等领域。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • 2020初级电工模拟题库与实操视频指南
    本文提供2020年初级电工模拟考试题库及实操视频资源,涵盖最新大纲和真题解析,帮助考生高效备考。内容包括理论知识、实操技能以及详细答案解析,适用于全国各地区电工(初级)考试。 ... [详细]
  • 本教程将详细介绍Python中的包、模块、类和函数的概念,探讨它们在程序中的作用及相互关系,帮助读者更好地理解Python的结构化编程。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 国庆头像生成小程序体验
    介绍一个可以快速生成带有国旗元素的国庆头像的小程序,带您回顾这一流行趋势。 ... [详细]
  • 微信小程序:授权登录与手机号绑定
    本文详细介绍了微信小程序中用户授权登录及绑定手机号的流程,结合官方指引和实际开发经验,提供了一套完整的实现方案,帮助开发者更好地理解和应用。 ... [详细]
  • 在使用Netty 4.1.48版本运行自带的HTTP服务器示例时,观察到大量本地IP环回连接。本文将探讨这些环回连接的原因,并解释其与TCP连接的关系。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
author-avatar
sx-March23
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有