关闭

Android SurfaceView

6389人阅读 评论(3) 收藏 举报

下面就贴上一个小程序代码,主要运用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)方法来,详细的在代码里已注释。






0
0
查看评论

Android SurfaceView的绘制详解

在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制。又由于不会占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,...
  • aa841538513
  • aa841538513
  • 2016-08-23 11:51
  • 6730

Android SurfaceView的基本用法

说明: 第一步:继承SurfaceView 并实现Callback,Runable 第二步:初始化SurfaceHolder mHolder,并添加事件 mHolder = getHolder(); mHolder.addCallback(this); 第三步:在public void ...
  • lovoo
  • lovoo
  • 2016-05-06 08:16
  • 1500

Android--SurfaceView使用详解

SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。         surfac...
  • chaoyu168
  • chaoyu168
  • 2016-05-17 14:17
  • 6657

Android两个SurfaceView叠加显示

最近一段时间一直在做智能后视镜产品(Android平台)里的相机模块,目前已经告一段落了。现在空闲的时候可以把一些技术点记录下来。其中有一个需求就是显示前、后两个摄像头的预览画面,并且可以相互切换显示。类似下面这个样子: 在Android里常用来显示相机预览的就是SurfaceView,因为不需要...
  • smileorcryps
  • smileorcryps
  • 2016-09-21 23:17
  • 4404

Android中SurfaceView使用详解

1.什么是SurfaceView?     Surface意为表层、表面,顾名思义SurfaceView就是指一个在表层的View对象。为什么说是在表层呢,这是因为它有点特殊跟其他View不一样,其他View是绘制在“表层”的上面,而它就是充当“表层”本身。SDK的文档 说到:...
  • android_cmos
  • android_cmos
  • 2017-04-03 12:54
  • 1984

Android SurfaceView的使用

概述定义SurfaceView是View类的继承类,这个View里内嵌了一个专门用于绘制的Surface,这个可以类似的理解成为一个在View里的Canvas(实际上Surface中包含一个Canvas)。你可以控制这个Surface的格式和尺寸。Surfaceview类则控制这个Surface在屏...
  • huaxun66
  • huaxun66
  • 2016-11-08 16:13
  • 1306

Android多媒体--通过SurfaceView录像并存储

程序的简单逻辑就是当我们开启程序的时候,会在相应的surfaceView显示当前摄像头所显示的内容(此刻我们还没有开始录制),当我们点击录制,程序就开始录制视频了,当我们点击结束的时候,就自动将录制的视频保存到提前设定好的目录中。同时将surfaceView继续保持摄像头的预览的内容。 public...
  • qq_28946307
  • qq_28946307
  • 2016-05-16 23:27
  • 3264

Android中截图(surfaceView)

前几天,在网上总结了一个方法,实现了在Android当前Activity的截图,本人测试确实通过了,不过有朋友说截出来的图是黑色的,不能看。我心想,这没有问题啊,相同的代码我就可以执行通过,并没有没有在意这个问题。可是,今天我再调用那个方法时,截出来的图部分是黑屏。我当时就郁闷了。网上的东西很全,但...
  • yilip
  • yilip
  • 2012-07-13 23:47
  • 19291

Android 之surfaceView (画动态圆圈)

通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效果。它通过不断循环的执行View.onDraw方法,每次执行都对内部显示的图形做一些调整,我们假设 onDraw方法每秒执行20次,这样就会形成一个20帧的补间动画效果。但是现实情况是你无法简单的控制View.onDraw的执...
  • Susan8888
  • Susan8888
  • 2014-11-07 21:50
  • 1249

android的surfaceview的用法

参考了文章:Android中SurfaceView的使用详解,  但在该文基础上进行了一定的修改。       说到sufaceview就得讲讲这个类是干什么的。是的,它是用来控制自定义绘图的。起码我现在看到的用法都是这样。     &...
  • heikefangxian23
  • heikefangxian23
  • 2015-11-30 11:36
  • 19523
    个人资料
    • 访问:12262763次
    • 积分:90838
    • 等级:
    • 排名:第16名
    • 原创:719篇
    • 转载:169篇
    • 译文:16篇
    • 评论:3070条
    学习经历
    中科院、百度、创新工场、小米、阿里巴巴、米扑科技

    期货从业资格证(2017.03)
    基金从业资格证(2016.11)
    证券投资顾问证(2016.9)
    证券从业资格证(2016.6)
    系统架构设计师(2013)
    软件设计师(2008)
    CSDN创业专访

    程序员创业邦
    QQ群: 239292073
    青春,每一个有梦想的人

    资深产品经理人
    QQ群: 338142405
    思与行,人人都是产品经理

    爱脚本,爱技术
    QQ群: 320296250
    (已满)
    python、ruby、php、go、shell

    程序人生的平凡生活
    QQ群: 282297696
    (已满)
    汇聚百度、小米、微软、腾讯、
    创新工场、阿里巴巴、日本雅虎
    个人博客
    博客专栏
    博客公告
    本博客内容,由米扑博客精心整理
    欢迎交流,欢迎转载,大家转载注明出处,禁止用于商业目的。

    文章分类
    文章存档