简介:SurfaceView继承自View,但它与View不同,View是在UI主线程中更新画面,而SurfaceView是在一个新线程中更新画面,View的特性决定了其不适合做动画,因为如果更新画面时间过长,那么UI线程就会被正在画的函数阻塞,所以Android通常用SurfaceView做动画效果。

下面给出一个使用SurfaceView做的简单例子:

package com.yw.myapiupdate.mydraw;import android.app.Activity;
import android.os.Bundle;
import android.view.Display;/*** * @author yw-tony**/
public class MyDrawActivity extends Activity{private SurfaceViewBall ball ;private int width = 0;private int height = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Display display = getWindowManager().getDefaultDisplay();width = display.getWidth();height = display.getHeight();ball = new SurfaceViewBall(this,width,height);/*ball.setOnTouchListener(new OnTouchListener() {float x = 0;float y = 0;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch(event.getAction()){case MotionEvent.ACTION_DOWN://按下ball.drawThread.top += event.getY();ball.drawThread.left += event.getX();ball.drawThread.buttom += event.getY();ball.drawThread.right += event.getX();break;case MotionEvent.ACTION_MOVE://移动//基于xy为圆心移动//得到手指的坐标(x,y)x = event.getRawX();y = event.getRawY();x = ((ball.drawThread.right - ball.drawThread.left)/2);y = (ball.drawThread.buttom - ball.drawThread.top)/2;ball.drawThread.top = (int) (event.getRawY()+y);ball.drawThread.left = (int) (event.getRawX()+x);ball.drawThread.right = (int)(200+event.getX()+x);ball.drawThread.buttom = (int)(200+event.getY()+y);log.e("getRawX", ""+event.getRawX());log.e("getRawY", ""+event.getRawY());log.e("getX", ""+event.getX());log.e("getRawY", ""+event.getY());//                    ball.drawThread.top += 20;
//                    ball.drawThread.left += event.getRawX();
//                    ball.drawThread.buttom += event.getRawY();
//                    ball.drawThread.right += event.getRawX();break;case MotionEvent.ACTION_UP://弹起ball.drawThread.top += 20;ball.drawThread.buttom += 20;ball.drawThread.top += event.getRawY();ball.drawThread.left += event.getRawX();ball.drawThread.buttom += event.getRawY();ball.drawThread.right += event.getRawX();break;}return true;}});*/setContentView(ball);}/*** 屏幕触摸事件*//*@Overridepublic boolean onTouchEvent(MotionEvent event) {switch(event.getAction()){case MotionEvent.ACTION_DOWN://按下ball.drawThread.top += event.getY();ball.drawThread.left += event.getX();ball.drawThread.buttom += event.getY();ball.drawThread.right += event.getX();break;case MotionEvent.ACTION_MOVE://移动ball.drawThread.top += event.getRawY();
//            ball.drawThread.left += event.getRawX();
//            ball.drawThread.buttom += event.getRawY();
//            ball.drawThread.right += event.getRawX();break;case MotionEvent.ACTION_UP://弹起ball.drawThread.top += event.getRawY();ball.drawThread.left += event.getRawX();ball.drawThread.buttom += event.getRawY();ball.drawThread.right += event.getRawX();break;}return true;}*/@Overridepublic void onBackPressed() {ball.drawThread.isRun = false;super.onBackPressed();}
}

MySurfaceView.java

package com.yw.myapiupdate.mydraw;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class SurfaceViewBall extends SurfaceView implements SurfaceHolder.Callback{private SurfaceHolder holder;public DrawThread drawThread ;private int width = 0;//屏幕宽度private int height = 0;//屏幕高度public SurfaceViewBall(Context context,int width ,int height) {super(context);holder = this.getHolder();//得到surfaceHolder对象//给holder添加回调函数holder.addCallback(this);drawThread = new DrawThread(holder);this.width = width;this.height = height;}/*** 当视图发生改变时执行*/@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}/*** 当创建视图时执行*/@Overridepublic void surfaceCreated(SurfaceHolder holder) {drawThread.isRun = true;drawThread.start();}/*** 当视图销毁时执行*/@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {drawThread.isRun = false;}/*** 绘制图像的线程* @author yw-tony**/class DrawThread extends Thread{private SurfaceHolder drawHolder;public boolean isRun;public int top = 50;public int buttom = 250;public int left = 100;public int right = 300 ;public DrawThread(SurfaceHolder drawHolder){this.drawHolder = drawHolder;}@Overridepublic void run() {int count = 0;boolean target = false;boolean targetHeightFlag = false;while(isRun){Canvas canvas = null;try{synchronized (SurfaceViewBall.class) {canvas = drawHolder.lockCanvas();//锁定画布canvas.drawColor(Color.BLACK);//设置画布颜色//创建画笔Paint paint = new Paint();paint.setTextSize(20.00f);//设置画笔颜色为白色
                        paint.setColor(Color.WHITE);//创建矩形区域/*left = left +20;right = right + 20;*//*对矩形左右两边进行碰撞检测*/if(left <= 0){//如果碰到左边界,则向右边移动left = left +20;right = right +20;target   = false;}else if(right >= width){//如果碰到右边界则向左边移动left = left -20;right = right - 20;target = true;}else{if(target){left = left -20;right = right - 20;}else{left = left +20;right = right + 20;}}/*对矩形上下两边进行碰撞检测*/if(top<=0){//如果矩形碰到顶部top = top+10;buttom = buttom + 10;targetHeightFlag = false;}else if(buttom >= height){//如果矩形碰到底部top = top-10;buttom = buttom - 10;targetHeightFlag = true;}else{//按正常流程执行if(targetHeightFlag){top = top-10;buttom = buttom - 10;}else{top = top+10;buttom = buttom + 10;}}Rect rect = new Rect(left,top,right,buttom);//绘制矩形区域
                        canvas.drawRect(rect, paint);//绘制字体canvas.drawText("这是第"+(count++)+"秒", 100, 300, paint);//休眠时间为1秒if(canvas != null){holder.unlockCanvasAndPost(canvas);//结束画布锁定,并提交改变
                        }Thread.sleep(50);}}catch(Exception e){}finally{}}}}}

Android SurfaceView概述相关推荐

  1. android Surface和SurfaceView概述

    android.view.Surface概述 翻译至android.view.Surface surface专门用来处理屏幕排版器(screen compositor)管理的一块原始内存(raw bu ...

  2. 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》

    详解与重构hyman<Android SurfaceView实战 打造抽奖转盘> 作者:邵励治 一.概述--关于SurfaceView您不得不知道的二三事 1.SurfaceView是干什 ...

  3. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  4. Android SurfaceView实战 带你玩转flabby bird (上)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载请标 ...

  5. Android零基础入门第33节:Android事件处理概述

    原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...

  6. Android SurfaceView实战 带你玩转flabby bird

    分析 仔细观察游戏,需要绘制的有:背景.地板.鸟.管道.分数: 游戏开始时: 地板给人一种想左移动的感觉: 管道与地板同样的速度向左移动: 鸟默认下落: 当用户touch屏幕时,鸟上升一段距离后,下落 ...

  7. Android Auto 概述

    Android Auto 概述 作为物联网的一个重要部分,车载系统是谷歌生态系统的一个重要终端,谷歌推出AndroidAuto.AndroidAuto是要把Android做进汽车行业.用户将手机和汽车 ...

  8. Android 传感器概述(一)

    Android 传感器概述(一) Android 传感器概述(一) 传感器简介 传感器框架 识别传感器和传感器特性 监控传感器事件 处理不同的传感器配置 在运行时检测传感器 使用 Google Pla ...

  9. Android SurfaceView简例

    Android SurfaceView简例 Android中各的SurfaceView和View有很大的不同,两者应用场景不同.大多数View能做的事情SurfaceView也可以,但是Surface ...

  10. Android SurfaceView实战 带你玩切水果1.0

    1.概述 最近开发一个智能项目,项目对象是某智能早教机器人,这个产品主要定位是儿童益智玩的游戏,并且可以从中学习到相关历史知识等相关知识,其中有个游戏关卡就是去到不同国家,可以玩不同的游戏.领导说要用 ...

最新文章

  1. P1603 斯诺登的密码
  2. java服务端监听_Java客户端正在监听WebSphere MQ服务器?
  3. Windows Phone 7中配置gmail, 使用outlook 同步邮件,日历,联系人等
  4. 线程同步之——互斥量及死锁问题
  5. VTK:可视化之Visualize2DPoints
  6. HTML5 Canvas 画纸飞机组件
  7. Linux怎么更新镜像,利用 Zsync 更新已有的 Ubuntu ISO 镜像
  8. hiho一下第128周 后缀自动机二·重复旋律5
  9. object c中的多态
  10. 单片机烧写一次后,就连不上单片机了的一种可能原因分享
  11. duilib设计器 DuiEditor简易教程 (DuiDesigner) (一)
  12. excel 第3讲:查找、替换与定位
  13. 用对分法求解方程x^3-x^2-x-1=0
  14. win7怎么关闭配置计算机,Win7电脑怎么设置定时关机?
  15. 跳楼机[DP+spfa]
  16. STM32F10X的IAP编程详解——开发指南
  17. Steam平台3款2D游戏开发软件对比(转)
  18. github本地项目上传到远程仓库
  19. ToolStrip控件的使用
  20. DOS或命令行下查看进程,结束进程命令

热门文章

  1. 又出现*_limited.sof的问题了,还有另一个奇怪的现象!
  2. 请求发送者与接收者解耦——命令模式(五)
  3. cgroup学习(三)——伪文件
  4. Java的GUI学习十一(编程菜单)
  5. ETL调优的一些分享
  6. 如何给awk传外部参数
  7. udp聊天室的界面实现
  8. 曲线积分和曲面积分及其几何应用、物理应用
  9. 网络编程----观察进程的启动与停止
  10. md5算出来不一样_西安美发培训学校:为什么我看到的色卡上的颜色和染出来的颜色会不一样呢?...