1. SurfaceView:

    完成单位时间内界面的快速切换(游戏界面流畅感)。

我们之前知道一般的View,只能在主线程里面显示,主线程中更新UI。但是SurfaceView可以在子线程中里面更新UI。

 

SurfaceView内置了双缓冲的技术,SurfaceView一旦启动,就会对应两个线程(线程A 和 线程B);

(1)线程A是前台,线程B是后台线程;

(2)线程A开始进行UI显示,(与此同时)线程B计算处理下一个UI的显示,A执行完了,B也执行完了;

(3)这时候,线程A和线程B快速切换角色,这时候线程B是前台进程,线程A是后台进程;

(4)这时候,线程B前台显示UI,线程A后台计算处理;B执行完了,A也执行完了;

(5)这时候,线程B和线程A快速切换角色,这时候线程A是前台进程,线程B是后台进程;

(6)如此反复;

2.案例演示使用SurfaceView,如下:

(1)activity_main.xml,如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <SurfaceView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:id="@+id/sv"/> </RelativeLayout>

(2)MainActivity,如下:

 package com.itheima.surfaceview;

 import android.os.Bundle;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View; public class MainActivity extends Activity {
private SurfaceView sv;
private Paint paint; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sv = (SurfaceView) findViewById(R.id.sv); // 舞台 paint = new Paint();
paint.setColor(Color.RED);
final SurfaceHolder holder = sv.getHolder(); // 导演, 导演控制如何显示。 holder.addCallback(new Callback() { @Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("界面被销毁了");
} @Override
public void surfaceCreated(final SurfaceHolder holder) {
System.out.println("界面才被创建出来");
new Thread() {
public void run() {
for (int i = 0; i < 500; i++) {
Canvas canvas = holder.lockCanvas();
canvas.drawCircle(200, 200, i, paint);
holder.unlockCanvasAndPost(canvas);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) { }
});
} }

      SurfaceView的这个控件,内存开销比较大;如果把SurfaceView放到onCreate里面会容易产生出现空指针,因为onCreate中调用SurfaceView的时候,可能SurfaceView还没有创建好,调用它当然就是空指针异常。

这里利用SurfaceHolder的一个API,就是addCallback(……),这里接口实现类有个方法是:

public void surfaceCreated(SurfaceHolder holder),它就是在SurfaceView创建完毕,之后调用的方法。

Android(java)学习笔记244:多媒体之SurfaceView的更多相关文章

  1. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  2. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  3. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  4. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  5. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

  6. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  7. 20145316许心远《Java学习笔记(第8版)》课程总结

    20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...

  8. Android:日常学习笔记(6)——探究活动(4)

    Android:日常学习笔记(6)——探究活动(4) 活动的启动模式 standard模式 standard是活动默认的启动模式,在不进行显示定义的情况下,所有活动都会自动使用这种启动模式. stan ...

  9. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

  10. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明

    Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...

随机推荐

  1. utf8汉字编码16进制对照

           utf8汉字编码16进制对照  GB    Unicode  UTF-8     Chinese Character Code  code# Code      (coded in UT ...

  2. TatukGIS-TGIS_Editor.CreateShape

    procedure CreateShape(const _layer: TObject; const _ptg: TGIS_Point3D; const _type: TGIS_ShapeType; ...

  3. Mvc Controller 单元测试 Mock User.Identity.Name

    被测试的Action 包含 User.Identity.Name 代码,在写测试代码需要Mock ControllerContext对象 代码如下: var mock = new Mock<Co ...

  4. urlconnection.connect()和url.openconnection()的区别

    urlconnect()ion.connect()()方法是抽象的:打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接). 如果在已打开连接(此时 connect()ed 字段的值为 tr ...

  5. Windows Phone 学习笔记(一) 数据存储

    独立存储设置IsolatedStorageSetting private IsolatedStorageSettings _appSettings; public MainPage() { Initi ...

  6. 大用处--PowerShell Management Library for Hyper-V.

    http://pshyperv.codeplex.com/releases 用脚本来收集及集成HYPER-V管理. 越来越似KVM,LIBVIRT啦.

  7. db2索引创建和删除

    在表trpt_jv_rpt_log_td的tim列上创建索引 create index dw_rpt.irpt_jv_rpt_log_td_tim on dw_rpt.trpt_jv_rpt_log_ ...

  8. keil MDK启动文件分析---基于LPC2100系列(其实都是相通的)

    转用MDK有一段时间了,越来越觉得MDK的强大,因为我之前都是用ADS1.2开发产品,所以更能体会到MDK的强大与易用性.MDK编译出来的代码与ADS1.2相比,代码量减少了很多,我的一个工程用ADS ...

  9. 获取Delphi所有类的类信息

    Delphi遍历进程中所有Class的TypeInfo,即便是在implementation中的class或者其他 class的private的子class. 一般普通EXE中的TypeInfo存放在 ...

  10. c#:for循环;穷举,迭代 练习

    一)穷举 1. 第x种买法:羽毛球拍xx个,羽毛球xx个,水xx瓶 2. 单位给发了一张150元购物卡,拿着到超市买三类洗化用品.     洗发水15元,香皂2元,牙刷5元.求刚好花完150元,有多少 ...