Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还是要追究一下原理怎么做的,我们新建一个GifLibrary,然后右键Properties——Android,我们把架包勾上
然后我们新建一个类GifSurfaceView继承自SurfaceView并且实现它的Callback接口
GifSurfaceView
package com.lgl.giflibrary;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
* 自定义Gif动画引擎 SurfaceView的实现主要是实现高速预览 我们将GIF图片绘制在SurfaceView上
*
* @author LGL
*
*/
public class GifSurfaceView extends SurfaceView implements Callback {
// 监听
private SurfaceHolder holder;
// 影片类
private Movie movie;
// 输入流
private InputStream is = null;
// 缩放
private float zoom = 1f;
// 图片路径
private String path;
// 判断是否网络读取
private boolean isNet = false;
// 逐步播放
private Handler handler = new Handler();
private Runnable run = new Runnable() {
@Override
public void run() {
// 不断绘制
Canvas canvas = holder.lockCanvas();
// 绘制的时候进行缩放比例,不影响下次绘图操作
canvas.save();
canvas.scale(zoom, zoom);
movie.draw(canvas, 0, 0);
canvas.restore();
holder.unlockCanvasAndPost(canvas);
// 开始绘制
movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
handler.removeCallbacks(run);
// 下次还用这个线程
handler.postDelayed(run, 30);
}
};
// 构造方法
public GifSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
holder = getHolder();
holder.addCallback(this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
// 判断读取方法
if (isNet) {
is = new URL(path).openConnection().getInputStream();
} else {
// 本地读取文件
is = getContext().getAssets().open(path);
}
// 读取流
movie = Movie.decodeStream(is);
// 设置SurfaceView的宽高
int width = movie.width();
int height = movie.height();
setMeasuredDimension((int) (width * zoom), (int) (height * zoom));
// 播放gif的帧动画
handler.post(run);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
// 初始化完成
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 读取影片流
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// SurfaceView被销毁时结束线程
handler.removeCallbacks(run);
}
public void setZoom(float zoom) {
this.zoom = zoom;
}
public void setPath(String path) {
this.path = path;
}
public void setNet(boolean isNet) {
this.isNet = isNet;
}
}
layout_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:background="#fff"
android:gravity="center" >
<com.lgl.giflibrary.GifSurfaceView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
这里不难看出,我们判断了两种方法,从网络加载还是本地加载,并且缩放比例是多少,那我们就来使用一下,我们直接新建一个项目GifDemo,同样的右键Properties——Android,然后add一个库
layout_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" >
<com.lgl.giflibrary.GifSurfaceView
android:id="@+id/gsv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true" />
</RelativeLayout>
然后我们就来在MainActivity中使用
//初始化
private GifSurfaceView gsv;
gsv = (GifSurfaceView) findViewById(R.id.gsv);
// 设置路径,这个路径实际上在library中是课更改的,我们在assets目录下放置一张gif图片
gsv.setPath("phont.gif");
// 设置缩放大小
gsv.setZoom(2f);
我们来运行一下
当然,如果是网上下载的,这个时候也我们可以用我们之前搭建的tomcat服务器测试一下
gsv = (GifSurfaceView) findViewById(R.id.gsv);
// 设置路径
// gsv.setPath("photo.gif");
// 设置缩放大小F
gsv.setZoom(2f);
// 如果是网络,记得添加权限
gsv.setNet(true);
gsv.setPath("http://localhost:8080/lgl/photo.gif");
截图都是一样的,好的,这个博客只是说我们先脑子里又这么一个概念,让我们更容易接受以后我们天马行空的想法的基础,这个libray要是真的放到项目中去还是有点欠缺火候,很多地方都不完善,只是作为一个演示的作用,Demo就不提供了,就这么一点点,当然你要是想要也可以评论一下
Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现的更多相关文章
- Android高级控件(四)——VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷
Android高级控件(四)--VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷 是不是感觉QQ空间什么的每次新版本更新那炫炫的引导页就特别的激动,哈哈,其实他实现起来真的很简单很 ...
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 如今的二维码可谓是烂大街了.到处都是二维码.什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...
- Android 高级控件(七)——RecyclerView的方方面面
Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...
- Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现
Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...
- Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例
Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表, ...
- Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能
Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...
- Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
Android高级控件(一)--ListView绑定CheckBox实现全选,添加和删除等功能 这个控件还是挺复杂的.也是项目中应该算是比較经常使用的了,所以写了一个小Demo来讲讲,主要是自己定义a ...
- Android高级控件--AdapterView与Adapter
在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上.在Android中有这样一种高级控件 ...
随机推荐
- Python descriptor
class A: def __init__(self, name): self.name = name def __get__(self, ins, cls): print('call get') i ...
- android面试手册
1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...
- Ant简介
Ant,apache开源项目,基于Java的构建工具,是一个小程序.它通过自动完成所有的编译代码,运行测试以及 打包重新部署等繁琐费力的任务来帮助软件团队开发大程序: Ant的目标是自动完成所有的构建 ...
- SQL Server性能优化——等待——SLEEP_BPROOL_FLUSH
前言: 有一个用于历史归档的数据库(简称历史库),经过一定时间的积累,数据文件已经达到700多GB,后来决定某些数据可以不需要保留,就把这部分数据truncate了,空余出600多GB的空间,也就是说 ...
- SSO 基于Cookie+fliter实现单点登录 实例解析(一)
接上文,SSO的理论讲解,接下来实践实践! 1.使用Cookie解决单点登录 技术点: 1.设置Cookie的路径为setPath("/").即Tomcat的目录下都有效 2.设置 ...
- Java的多态及注意事项
什么是多态: 多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序.在Java中,所有的方法都是通过动态绑定实现多态的.将一个方法调用同一个方法主体关联起来被称作绑定.动态绑定的含义是在运行 ...
- 基于CAS实现单点登录(SSO):工作原理
工作中使用到了SSO,网上看到了这个博客的一系列文章感觉不错,转载收藏 源地址http://blog.csdn.net/tch918/article/details/19930037 系列文章的第一篇 ...
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...
- iOS中 CoreGraphics快速绘图(详解) 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 第一步:先科普一下基础知识: Core Graphics是基于C的API,可以用于一切绘图操作 Core Graph ...
- Java正则表达式小记
http://blog.csdn.net/pipisorry/article/details/51059500 正则表达式的一般规则都一样,见[python正则表达式] java正则表达式中的特殊字符 ...