`

Android SurfaceView

阅读更多

 

下面就贴上一个小程序代码,主要运用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.  }  

 

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.  }  


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)方法来,详细的在代码里已注释。

更多信息请查看 java进阶网 http://www.javady.com

分享到:
评论

相关推荐

    android surfaceview自定义拍照 绘制头像轮廓

    在Android开发中,`SurfaceView`是一个非常重要的组件,它提供了与硬件图形渲染直接交互的能力。这个项目"android surfaceview自定义拍照 绘制头像轮廓"是基于网上现有的示例代码进行了修改,用于实现一个自定义的...

    Android SurfaceView 实现图片缩放 滑动

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...

    android surfaceview 悬浮窗圆角 windowmanager

    在Android开发中,`SurfaceView`是一个特殊类型的`View`,它允许开发者在应用程序中创建一个独立于应用程序主线程的渲染表面。`SurfaceView`通常用于处理高性能的图形或者视频播放,因为它可以在单独的线程中进行...

    Android SurfaceView使用Demo

    **Android SurfaceView 使用详解** `SurfaceView` 是 Android 系统提供的一种特殊的视图组件,它允许开发者在应用程序中创建高性能的图形界面,比如游戏、视频播放器等需要连续更新图像的应用。`SurfaceView` 提供...

    android SurfaceView做二维码扫描源码

    在Android开发中,实现二维码和一维码扫描功能通常涉及到多个关键知识点,其中包括SurfaceView的使用、摄像头控制、图像处理以及二维码识别库的集成。以下将详细解释这些内容。 首先,`SurfaceView`是Android系统...

    Android SurfaceView 多线程 滑块

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行绘制操作,从而提高图形渲染性能,特别适用于需要连续更新显示内容的应用,如游戏、视频播放等。本示例中,"Android SurfaceView 多...

    android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的动画或视频播放成为可能。在这个“android SurfaceView实现人物动画”的示例程序中,我们将深入探讨如何利用...

    android surfaceView 双缓冲

    android使用双缓冲辨析及surfaceview使用例子

    Android SurfaceView 实现实时显示摄像头视频

    `SurfaceView`是Android提供的一种用于高效显示多媒体数据的视图组件,尤其适合处理像视频流这样的实时数据。本篇文章将深入探讨如何利用`SurfaceView`实现实时显示摄像头视频。 首先,我们需要了解`SurfaceView`的...

    Android SurfaceView添加组件view不被组件覆盖.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,比如游戏、视频播放等需要频繁更新画面的应用。SurfaceView有一个特点,就是它的内容在窗口的最顶层,通常不会被其他普通View...

    Android SurfaceView添加组件view不被组件覆盖-IT计算机-毕业设计.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,比如游戏或者视频播放器。SurfaceView具有自己的绘制表面,与主线程分离,因此可以进行独立于UI线程的高性能渲染。...

    android SurfaceView游戏框架

    在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...

    Android SurfaceView实现动画效果

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制,常用于游戏或者视频播放等需要连续更新显示内容的场景。本篇文章将详细探讨如何利用SurfaceView实现动画效果,...

    android surfaceview示例源码下载

    android中的surfaceview示例源码下载,Android SurfaceView在游戏开发中使用想当广泛,SurfaceView对于画面的控制有着更大的自由度,它不像View那样要用handler来更新,但是网上关于 SurfaceView使用这方面的参考...

    android SurfaceView添加线程源码

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理高性能图形和视频渲染时。`SurfaceView`提供了直接与硬件图形管道交互的能力,使得开发者可以在单独的线程中进行绘制,从而避免阻塞UI主线程,...

    Android SurfaceView实现加载GIF动画

    在Android开发中,`SurfaceView`是一个非常重要的组件,它为高效显示动态图像和视频提供了可能。本篇文章将深入探讨如何使用`SurfaceView`来实现加载GIF动画,这是一个常见的需求,特别是在游戏开发或者需要实时渲染...

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

    安卓Android源码——SurfaceView添加组件view不被组件覆盖.zip

    `Android SurfaceView添加组件view不被组件覆盖` 这个文件可能是示例代码或者详细教程,里面应该包含了如何将这些概念应用到实际项目中的具体步骤。 总的来说,处理 `SurfaceView` 与其他组件的层次关系是安卓开发...

    Android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,特别是用于实现动画效果,如游戏或者视频播放等。SurfaceView拥有自己的绘图表面,与主线程分离,因此在处理复杂的...

Global site tag (gtag.js) - Google Analytics