Android TextureView简易教程
如果你想显示一段在线视频或者任意的数据流比如视频或者OpenGL 场景,你可以用android中的TextureView做到。
TextureView的兄弟SurfaceView
应用程序的视频或者opengl内容往往是显示在一个特别的UI控件中:SurfaceView。SurfaceView的工作方式是创建一个置于应用窗口之后的新窗口。这种方式的效率非常高,因为SurfaceView窗口刷新的时候不需要重绘应用程序的窗口(android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者是局部的刷新都会导致整个视图结构全部重绘一次,因此效率非常低下,不过满足普通应用界面的需求还是绰绰有余),但是SurfaceView也有一些非常不便的限制。
因为SurfaceView的内容不在应用窗口上,所以不能使用变换(平移、缩放、旋转等)。也难以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如View.setAlpha()。
为了解决这个问题 Android 4.0中引入了TextureView。
TextureView
与SurfaceView相比,TextureView并没有创建一个单独的Surface用来绘制,这使得它可以像一般的View一样执行一些变换操作,设置透明度等。另外,Textureview必须在硬件加速开启的窗口中。
TextureView的使用非常简单,你唯一要做的就是获取用于渲染内容的SurfaceTexture。具体做法是先创建TextureView对象,然后实现SurfaceTextureListener接口,代码如下:
- private TextureView myTexture;
- public class MainActivity extends Activity implements SurfaceTextureListener{
- protected void onCreate(Bundle savedInstanceState) {
- myTexture = new TextureView(this);
- myTexture.setSurfaceTextureListener(this);
- setContentView(myTexture);
- }
- }
Activity implements了SurfaceTextureListener接口因此activity中需要重写如下方法:
- @Override
- public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2) {
- }
- @Override
- public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
- }
- @Override
- public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2) {
- }
- @Override
- public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
- }
TextureView可以使用setAlpha和setRotation方法达到改变透明度和旋转的效果。
- myTexture.setAlpha(1.0f);
- myTexture.setRotation(90.0f);
除了上面的方法之外,TextureView 还有如下方法:
| 序号 | 方法&描述 |
|---|---|
| 1 | getSurfaceTexture() This method returns the SurfaceTexture used by this view. |
| 2 | getBitmap(int width, int height) This method returns Returns a Bitmap representation of the content of the associated surface texture. |
| 3 | getTransform(Matrix transform) This method returns the transform associated with this texture view. |
| 4 | isOpaque() This method indicates whether this View is opaque. |
| 5 | lockCanvas() This method start editing the pixels in the surface |
| 6 | setOpaque(boolean opaque) This method indicates whether the content of this TextureView is opaque. |
| 7 | setTransform(Matrix transform) This method sets the transform to associate with this texture view. |
| 8 | unlockCanvasAndPost(Canvas canvas) This method finish editing pixels in the surface. |
例子
下面的例子演示了如何使用TextureView类,我们创建了一个可以在TextureView中预览Camera的demo,可以改变它的角度以及方向。当然程序需要运行在有摄像头的设备上。
下面是MainActivity.java中的代码:
- package com.example.textureview;
- import java.io.IOException;
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.graphics.SurfaceTexture;
- import android.hardware.Camera;
- import android.os.Bundle;
- import android.view.Gravity;
- import android.view.Menu;
- import android.view.TextureView;
- import android.view.TextureView.SurfaceTextureListener;
- import android.view.View;
- import android.widget.FrameLayout;
- public class MainActivity extends Activity implements SurfaceTextureListener {
- private TextureView myTexture;
- private Camera mCamera;
- @SuppressLint("NewApi")
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- myTexture = new TextureView(this);
- myTexture.setSurfaceTextureListener(this);
- setContentView(myTexture);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- @SuppressLint("NewApi")
- @Override
- public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1,
- int arg2) {
- mCamera = Camera.open();
- Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
- myTexture.setLayoutParams(new FrameLayout.LayoutParams(
- previewSize.width, previewSize.height, Gravity.CENTER));
- try {
- mCamera.setPreviewTexture(arg0);
- } catch (IOException t) {
- }
- mCamera.startPreview();
- myTexture.setAlpha(1.0f);
- myTexture.setRotation(90.0f);
- }
- @Override
- public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
- mCamera.stopPreview();
- mCamera.release();
- return true;
- }
- @Override
- public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,
- int arg2) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
- // TODO Auto-generated method stub
- }
- }
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"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context=".MainActivity" >
- <TextureView
- android:id="@+id/textureView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_centerHorizontal="true" />
- </RelativeLayout>
AndroidManifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.textureview"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="17" />
- <uses-permission android:name="android.permission.CAMERA"/>
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.example.textureview.MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
不同参数下的截图:
myTexture.setAlpha(0.5f);

myTexture.setAlpha(1.5f);

myTexture.setAlpha(1.0f);

Android TextureView简易教程的更多相关文章
- Android开发简易教程
Android开发简易教程 Android 开发因为涉及到代码编辑.UI 布局.打包等工序,有一款好用的IDE非常重要.Google 最早提供了基于 Eclipse 的 ADT 作为开发工具,后来在2 ...
- Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自己主动填入功能结合实例)
用户注冊或者找回password时通常会用到短信验证功能.这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注冊用户.获取SD ...
- Android实战简易教程-第四十枪(窃听风云之短信监听)
近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台 ...
- Android实战简易教程-第十三枪(五大布局研究)
我们知道Android系统应用程序通常是由多个Activity组成,而这些Activity以视图的形式展如今我们面前, 视图都是由一个一个的组件构成的. 组件就是我们常见的Button.TextEdi ...
- Android实战简易教程-第九枪(BitmapFactory.Options对资源图片进行缩放)
我们知道,我们编写的应用程序都是有一定内存限制的.程序占用了过高的内存就easy出现OOM(OutOfMemory)异常.因此在展示高分辨率图片的时候,最好先将图片进行压缩,压缩后的图片大小应该和用来 ...
- Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)
上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...
- Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)
上一篇我们介绍了怎样由uri转换成String ,本文就用到了上篇文章的方法.以下我们介绍一下怎样设置头像后将头像图片上传到云端的方法,本文基于Bmob提供的服务. 看一下代码:(布局文件和前两篇文章 ...
- Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)
接上一篇,加入验证用户名是否已经注冊功能! 仅仅须要改动MainActivity.java: package com.example.logintest; import java.util.List; ...
- Android实战简易教程-第十枪(画廊组件Gallery有用研究)
Gallery组件用于拖拽浏览图片,以下我们就来看一下怎样实现. 一.实现Gallery 1.布局文件非常easy: <?xml version="1.0" encoding ...
随机推荐
- 【Computer Vision】图像单应性变换/投影/仿射/透视
一.基础概念 1. projective transformation = homography = collineation. 2. 齐次坐标:使用N+1维坐标来表示N维坐标,例如在2D笛卡尔坐标 ...
- WPF 内部的5个窗口之 MediaContextNotificationWindow
原文:WPF 内部的5个窗口之 MediaContextNotificationWindow 本文告诉大家在 WPF 内部的5个窗口的 MediaContextNotificationWindow 是 ...
- 普通码农和CTO之间的差距
虚心 学习的第一步是--"我不懂".一个空是水杯才能装水,如果是满的就没有办法装水了."自我肯定"是一种非常难克服的习惯,经常会有朋友看到某个技术或者实现之后不 ...
- Java基础学习总结(7)——Object类
一.Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能 ...
- Java读书笔记一(异常处理)
1.介绍 在开发过程中.都会遇到程序执行时的异常,比如逻辑错误.硬件故障等,本篇博客将会具体的介绍一下Java中的异常处理机制. 2.Try和Catch捕获异常 我们在处理异常过程中经经常使用到的就是 ...
- MySql基础总结(1)
对于MySql已经是第二次看了,这次基本的目的是将MySql系统的归纳一边,之前学MySql是将笔记写在本子上,以后不想总带着本子,所以再花点时间把笔记归纳在博客中. 下午已将安装步骤具体的写了.如今 ...
- C# 解压及压缩文件源代码
using System.IO; using System.Windows.Forms; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.Sh ...
- 智课雅思词汇---十一、spect是什么意思
智课雅思词汇---十一.spect是什么意思 一.总结 一句话总结:词根:spect, speci, spec(spic, spi, spy) = to look, to see 看 1.port是什 ...
- svn服务器的搭建过程 主要为服务端
yum -y install subversion 查看版本信息 svnserve --version 创建svn仓库目录 mkdir -p /var/svn/svnrepos 创建svn仓库 svn ...
- Lists and strings
A string is a sequence of characters and a list is a sequence of values, but a list of characters is ...