Android SurfaceView

标签: android import callback thread class up
6407人阅读 评论(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)方法来,详细的在代码里已注释。






查看评论

android的surfaceview的用法

参考了文章:Android中SurfaceView的使用详解,  但在该文基础上进行了一定的修改。       说到sufaceview就得讲讲这个类是干什么的。是的,它是用来控制自定义绘图的。起...
  • heikefangxian23
  • heikefangxian23
  • 2015-11-30 11:36:43
  • 19932

Android中SurfaceView使用详解

1.什么是SurfaceView?     Surface意为表层、表面,顾名思义SurfaceView就是指一个在表层的View对象。为什么说是在表层呢,这是因为它有点特殊跟其他View不一样,其...
  • android_cmos
  • android_cmos
  • 2017-04-03 12:54:22
  • 9714

Android SurfaceView的使用

概述定义SurfaceView是View类的继承类,这个View里内嵌了一个专门用于绘制的Surface,这个可以类似的理解成为一个在View里的Canvas(实际上Surface中包含一个Canva...
  • huaxun66
  • huaxun66
  • 2016-11-08 16:13:57
  • 1776

Android布局之SurfaceView与控件结合

在做Android课程项目的过程中,因为涉及到了游戏画图与Android自带控件(如Button,TextView等)在一个Activity中的结合使用,故,这里介绍一下将二者结合为一的作法。 网上有...
  • cw19860701
  • cw19860701
  • 2015-07-08 00:55:45
  • 2454

SurfaceView闪烁问题的根源-双缓存机制

上篇中提到了SurfaceView绘制触摸轨迹时出现的闪烁问题,这里就说明下产生这种困扰的根源——双缓存机制。     Android中的SurfaceView在更新视图时,为了提高更新效率,加强用户...
  • tobacco5648
  • tobacco5648
  • 2012-12-05 18:24:50
  • 25274

Android中截图(surfaceView)

前几天,在网上总结了一个方法,实现了在Android当前Activity的截图,本人测试确实通过了,不过有朋友说截出来的图是黑色的,不能看。我心想,这没有问题啊,相同的代码我就可以执行通过,并没有没有...
  • yilip
  • yilip
  • 2012-07-13 23:47:38
  • 19708

Android开发:SurfaceView上新建线程绘制旋转图片 及 刷新特定区域(脏矩形)

何为脏矩形?比如surfaceview上绘制旋转图片的时候,只刷新一个特定的矩形区域就可以了。这个矩形区域就是脏矩形。在surfaceview上  canvas = holder.lockCanvas...
  • yanzi1225627
  • yanzi1225627
  • 2013-02-15 09:47:50
  • 20353

Android SurfaceView的基本用法

说明: 第一步:继承SurfaceView 并实现Callback,Runable 第二步:初始化SurfaceHolder mHolder,并添加事件 mHolder = getHolder...
  • lovoo
  • lovoo
  • 2016-05-06 08:16:37
  • 1619

如何在Activity调用surfaceView实现透明或半透明的效果

一、实现Activity透明或半透明的效果。(方法一:使用系统自带的方法) 在AndroidManifest.xml文件下进行配置,只要任意加一条到Activity中,就可以实现透明和半透明的效果,图...
  • persistence_lw
  • persistence_lw
  • 2016-11-17 16:42:39
  • 1108

自定义surfaceview画图并保存Canvas到DCIM

自定义surfaceview package com.app.fantasticbaby; import java.io.File; import java.io.FileNotFoun...
  • u010015933
  • u010015933
  • 2016-05-30 15:49:35
  • 1007
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1243万+
    积分: 9万+
    排名: 15
    博客公告
    本博客内容,由米扑博客精心整理
    欢迎交流,欢迎转载,大家转载注明出处,禁止用于商业目的。

    博客专栏
    文章存档