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;
@Override
protected 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;
@Override
public 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);
}
/**
* 屏幕触摸事件
*/
/*@Override
public 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;
}*/
@Override
public 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;
}
/**
* 当视图发生改变时执行
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) { }
/**
* 当创建视图时执行
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
drawThread.isRun = true;
drawThread.start();
}
/**
* 当视图销毁时执行
*/
@Override
public 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;
}
@Override
public 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 SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- Android SurfaceView实战 带你玩转flabby bird (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...
- Android SurfaceView vs TextureView
Android SurfaceView vs TextureView https://github.com/crosswalk-project/crosswalk-website/wiki/Andro ...
- Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法
http://www.cnblogs.com/SkyD/archive/2010/11/08/1871423.html Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法 Surfa ...
- [Learn Android Studio 汉化教程]第二章:Android Studio概述(一)
[Learn Android Studio ]第二章:Android Studio概述(一) Android Studio是一个视窗化的开发环境.为了充分利用有限的屏幕空间,不让你束手束脚,Andro ...
- Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护
Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...
- Android SurfaceView内容获取
Android SurfaceView内容获取 这几天在做一个Android的小项目,项目中需要使用到SurfaceView来显示相机捕获的内容,同时还有一个SurfaceView用于绘制一些辅助线, ...
- android视图概述
android视图概述 一.简介 数据和控件分开的作用: 便于引用 便于修改:修改的时候直接改一次数据就可以了
- Android零基础入门第33节:Android事件处理概述
原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...
随机推荐
- gulp常用插件汇总
1.gulp-sass 预编译 sass 文件为 css 文件,SASS 不多说,如果项目中有使用 sass ,那么这个插件应该是必备的.前面的一篇文章中,已经对该插件有所使用了,可配置编译后输出风格 ...
- JS实现自定义排序
定义:用本地特定的顺序来比较两个字符串. 语法:stringObject.localeCompare(target) 参数:target——要以本地特定的顺序与 stringObject 进行比较的字 ...
- [HNOI2011]括号修复
设\(nd[4]\) 0--多出来的右括号 1--多出来的左括号 2--取反后多出来的右括号 3--取反后多出来的左括号 这样一来 Swap: swap(0,3),swap(1,2),swap(sn[ ...
- BFC(块状格式化上下文)
今天先来说关于BFC的一些基础知识 BFC是块状格式化上下文,它是一个独立的渲染区域,规定了内部如何布局,并且这个布局和外部毫不相干 触发BFC的方法 1.根元素(即html) 2.float属性不为 ...
- React之小知识点总结
总结react中常常被忽略的小知识点 1)即使state里设置成和之前的值一样,render也会重新渲染 2)父组件传给子组件的属性(props是只读的,在子组件中已在this.state里将属性赋值 ...
- C#与java中的AES加解密互解算法
一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...
- Play framework 安装
1.确定配置好了Java环境,在命令窗口输入java -version,得到版本号,则表示配好了Java环境 2.下载play文件进行安装http://www.playframework.org/,下 ...
- js实现浏览器用户信息收集
前言 这是一个通过html5,javascript用于收集用户通过上网泄漏的各种信息,包括地理位置,IP地址,照片,语音,浏览器版本等信息.结合大数据,可实现广告定向投放,用户追踪,用户行为分析,用户 ...
- CSS 小结笔记之伸缩布局 (flex)
CSS flex 是一种伸缩布局,之前块级元素布局在同一行,可以通过display或position或float来实现,而本篇介绍一个新的方法——flex(弹性布局). flex 为和模型布局提供了极 ...
- GIT回推本地commit近期版本
一次意外吧,本地add并且commit之后拉了别人错误的代码下来,后来本地又需要进行编写测试,无奈只能回推到自己刚刚commit过的代码,但是git命令除了拉去提交等其他的不是很熟悉,在度娘之后也遇到 ...