简介: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概述的更多相关文章

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

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

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

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...

  3. Android SurfaceView vs TextureView

    Android SurfaceView vs TextureView https://github.com/crosswalk-project/crosswalk-website/wiki/Andro ...

  4. Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法

    http://www.cnblogs.com/SkyD/archive/2010/11/08/1871423.html Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法 Surfa ...

  5. [Learn Android Studio 汉化教程]第二章:Android Studio概述(一)

    [Learn Android Studio ]第二章:Android Studio概述(一) Android Studio是一个视窗化的开发环境.为了充分利用有限的屏幕空间,不让你束手束脚,Andro ...

  6. Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护

    Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...

  7. Android SurfaceView内容获取

    Android SurfaceView内容获取 这几天在做一个Android的小项目,项目中需要使用到SurfaceView来显示相机捕获的内容,同时还有一个SurfaceView用于绘制一些辅助线, ...

  8. android视图概述

    android视图概述 一.简介 数据和控件分开的作用: 便于引用 便于修改:修改的时候直接改一次数据就可以了

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

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

随机推荐

  1. [亲测!超级简单] Centos 安装Python3.6环境

    配置好Python3.6和pip3安装EPEL和IUS软件源 yum install epel-release -y yum install https://centos7.iuscommunity. ...

  2. 18:Tomorrow never knows?

    18:Tomorrow never knows? 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 甲壳虫的<A day in the life>和 ...

  3. [Android] 状态栏的一些认识

    前段时间遇到几个关于状态栏的问题,又了解了一下状态栏相关的知识,现在做一下记录. 本文地址:http://www.cnblogs.com/rossoneri/p/4316343.html 前戏和问题 ...

  4. ASP.NET Core Razor生成Html静态文件

    一.前言 最近做项目的时候,使用Util进行开发,使用Razor写前端页面.初次使用感觉还是不大习惯,之前都是前后端分离的方式开发的,但是使用Util封装后的Angular后,感觉开发效率还是杠杠滴. ...

  5. LeetCode题解之Unique Paths II

    1.题目描述 2.问题描述 使用动态规划算法,加上条件检测即可 3.代码 int uniquePathsWithObstacles(vector<vector<int>>&am ...

  6. python自学——文件打开

    #文件的打开 新建一个文件new file.txt #方法一:f=open("yesterday","r",encoding="utf-8" ...

  7. Sql Server与.Net(C#)中星期值对比

    最近发现Sql Server与.Net(C#)中星期值居然不匹配,倒不知道依哪一个了. 1.Sql Server declare @date datetime; set @date = '2017-0 ...

  8. TMOUT优化终端超时

    有时候,管理员终端登陆了系统,如果离开没有退出账户,则会有安全隐患存在,因此需要优化终端超时. 设置终端超时: export TMOUT=10 永久生效: echo "export TMOU ...

  9. Redis缓存穿透、缓存雪崩、redis并发问题分析

    把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下: (一)缓存和数据库间数据一致性问题分布式环境下(单机就不用说了)非常 ...

  10. MySQL基础之 视图

    视图 视图就是从一个表或多个表导出来的一张虚拟的表.通过这个窗口可以看到系统专门提供的数据,方便用户操作的同时增加了安全性. 视图的特点: 1.视图的列可以来自于不同的表. 2.视图是由实际存在的表创 ...