Android SurfaceView概述
简介: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概述相关推荐
- android Surface和SurfaceView概述
android.view.Surface概述 翻译至android.view.Surface surface专门用来处理屏幕排版器(screen compositor)管理的一块原始内存(raw bu ...
- 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》
详解与重构hyman<Android SurfaceView实战 打造抽奖转盘> 作者:邵励治 一.概述--关于SurfaceView您不得不知道的二三事 1.SurfaceView是干什 ...
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- Android SurfaceView实战 带你玩转flabby bird (上)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载请标 ...
- Android零基础入门第33节:Android事件处理概述
原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...
- Android SurfaceView实战 带你玩转flabby bird
分析 仔细观察游戏,需要绘制的有:背景.地板.鸟.管道.分数: 游戏开始时: 地板给人一种想左移动的感觉: 管道与地板同样的速度向左移动: 鸟默认下落: 当用户touch屏幕时,鸟上升一段距离后,下落 ...
- Android Auto 概述
Android Auto 概述 作为物联网的一个重要部分,车载系统是谷歌生态系统的一个重要终端,谷歌推出AndroidAuto.AndroidAuto是要把Android做进汽车行业.用户将手机和汽车 ...
- Android 传感器概述(一)
Android 传感器概述(一) Android 传感器概述(一) 传感器简介 传感器框架 识别传感器和传感器特性 监控传感器事件 处理不同的传感器配置 在运行时检测传感器 使用 Google Pla ...
- Android SurfaceView简例
Android SurfaceView简例 Android中各的SurfaceView和View有很大的不同,两者应用场景不同.大多数View能做的事情SurfaceView也可以,但是Surface ...
- Android SurfaceView实战 带你玩切水果1.0
1.概述 最近开发一个智能项目,项目对象是某智能早教机器人,这个产品主要定位是儿童益智玩的游戏,并且可以从中学习到相关历史知识等相关知识,其中有个游戏关卡就是去到不同国家,可以玩不同的游戏.领导说要用 ...
最新文章
- P1603 斯诺登的密码
- java服务端监听_Java客户端正在监听WebSphere MQ服务器?
- Windows Phone 7中配置gmail, 使用outlook 同步邮件,日历,联系人等
- 线程同步之——互斥量及死锁问题
- VTK:可视化之Visualize2DPoints
- HTML5 Canvas 画纸飞机组件
- Linux怎么更新镜像,利用 Zsync 更新已有的 Ubuntu ISO 镜像
- hiho一下第128周 后缀自动机二·重复旋律5
- object c中的多态
- 单片机烧写一次后,就连不上单片机了的一种可能原因分享
- duilib设计器 DuiEditor简易教程 (DuiDesigner) (一)
- excel 第3讲:查找、替换与定位
- 用对分法求解方程x^3-x^2-x-1=0
- win7怎么关闭配置计算机,Win7电脑怎么设置定时关机?
- 跳楼机[DP+spfa]
- STM32F10X的IAP编程详解——开发指南
- Steam平台3款2D游戏开发软件对比(转)
- github本地项目上传到远程仓库
- ToolStrip控件的使用
- DOS或命令行下查看进程,结束进程命令