androidgifdrawable
‘壹’ 安卓中如何添加显示gif动态图片
大家都知道,Android开发模拟器为了节省内存,一般不支持直接显示gif图片,即使你强制设置了,也只会显示图片的第一帧。看到网上也有许多的方法,来实现此功能,可都比较的繁琐,需要修改android源代码来实现或者用gif解析器来实现。在此文章中,这里教大家一种比较简洁的一个方法,你可以把这个类当做是一种工具类。用的时候,直接搬到程序里面,更改下图片的资源,就可以非常轻松的显示gif图片了。
步骤1:看一下这个工具类的实例代码:MyGifView.java
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.util.AttributeSet;
import android.view.View;
public class MyGifView extends View{
private long movieStart;
private Movie movie;
//此处必须重写该构造方法
public MyGifView(Context context,AttributeSet attributeSet) {
super(context,attributeSet);
//以文件流(InputStream)读取进gif图片资源
movie=Movie.decodeStream(getResources().openRawResource(R.drawable.keyboard));
}
@Override
protected void onDraw(Canvas canvas) {
long curTime=android.os.SystemClock.uptimeMillis();
//第一次播放
if (movieStart == 0) {
movieStart = curTime;
}
if (movie != null) {
int raction = movie.ration();
int relTime = (int) ((curTime-movieStart)%raction);
movie.setTime(relTime);
movie.draw(canvas, 0, 0);
//强制重绘
invalidate();
}
super.onDraw(canvas);
}
}
此工具类中,只做了2件事情。1,构造方法;2,重写了onDraw()方法。大家以后用的话,只需拷贝此类到你的工程下即可起作用。
步骤2:布局文件代码 activity_main.xml
<LinearLayout 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" >
<TextView
android:text="====Gif图片测试布局===="
android:layout_height="wrap_content"
android:layout_width="wrap_content"
/>
<com.example.showgifimage.MyGifView
android:id="@+id/iv"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_margin="20dp"
/>
</LinearLayout>
布局文件中,注意的是:标签的设置 <com.example.showgifimage.MyGifView/>.
格式:包名+.类名
步骤3:主activity中调用
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
就这么轻松的把Gif图片显示了~~
‘贰’ Android开发怎样显示gif格式的图片
1、下载安装AnimGIF Live Wallpaper,值得注意的是,安装成功之后,在应用程序列表是无法找到它的图标,找到方式看下图:2、进入AnimGIF Live Wallpaper,点击左下方的设置按钮,选择“Set GIF Image”按钮即进入文件目录浏览,找到需要设置为壁纸的GIF动图,点击设置壁纸即可。注意事项:1、GIF动图体积不要过大,尽量不要超过1M,否则会出现卡顿、掉帧等播放问题;2、设置动图为壁纸后,会导致耗电量的增加。
‘叁’ 有哪些常用或优秀的 Android 第三方类库
Android开发第三方类库分类:
gifview 、 gifview2
这两个项目是同一人开发的,用于显示gif动画,纯java解码 ,gif图片过大会产生OOM。
android-gif-drawable
一个也是用于解码显示gif的类库,采用jni解码,大GIF也不会产生oom,完美运行。
PhotoView
PhotoView 是一款扩展自Android ImageView ,支持通过单点/多点触摸来进行图片缩放的智能控件。使用比较简单,提供了一个名为PhotoView的控件,可以直接像普通ImageView那样使用。
特性:支持单点/多点触摸,即时缩放图片;支持平滑滚动;在滑动父控件下能够运行良好;(例如:ViewPager)
不同的环境使用不同的类库,不同的系统也是同样的道理。
‘肆’ Android 中的动画有哪几类,它们的特点和区别是什么
Android3.0(即API Level11)前Android仅支持2种画:别Frame Animation(逐帧画)Tween Animation(补间画)3.0Android支持种新画系统称:Property Animation(属性画)
、Frame Animation:(逐帧画)
理解帧帧播放图片利用眼视觉残留原理给我带画觉原理GIF图片、电影播放原理
1.定义逐帧画比较简单要使用元素定义所播放帧即
(1) android:oneshot 设置否仅播放
(2) android:drawable 设置每帧图片
(3) android:ration 设置图片间切换间隔
2.习惯AnimationDrawable设置ImageView背景
android:background=@anim/frame_anim
我java代码获取AnimationDrawable象
AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();
(需要注意AnimationDrawable默认播放调用其start()始播放stop停止播放)
3.面画文件通xml文件配置喜欢通java代码创建AnimationDrawable象通addFrame(Drawable frame, int ration)向画添加帧start()
二、Tween Animation:(补间画)
补间画我需指定始、结束关键帧变化其帧由系统计算必自帧帧定义
1. Android使用Animation代表抽象画包括四种类:AlphaAnimation(透明度画)、ScaleAnimation(缩放画)、TranslateAnimation(位移画)、RotateAnimation(透明度画)Android面允许java创建Animation类象般都采用画资源文件定义画界面与逻辑离
(set同定义画起执行)
2. android:interpolator=@android:anim/linear_interpolator控制画期间需要补入少帧简单说控制画速度些翻译插值Interpolator几种实现类:LinearInterpolator、AccelerateInterpolator、、CycleInterpolator、DecelerateInterpolator具体使用参考官API Demo
3. 定义anim文件我通AnimationUtils工具类加载加载功返Animation通ViewstartAnimation(anim)始执行画
Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
//设置画结束保留结束状态
anim.setFillAfter(true);
//设置插值效
anim.setInterpolator(interpolator);
//view执行画
view. startAnimation(anim);
三、Property Animation:(属性画)
属性画Android 3.0才引进直接更改我象属性面提Tween Animation更改View绘画效View真实属性改变假设用Tween画Button左边移右边论点击移Button都没反应点击移前Button位置才反应Button位置属性木改变Property Animation则直接改变View象属性值让我少做些处理工作提高效率与代码读性
(1)ValueAnimator:包含Property Animation画所核功能画间始、结束属性值相应间属性值计算等应用ValueAnimator两步骤
1计算属性值
2根据属性值执行相应作改变象某属性
我主第二步需要实现ValueAnimator.onUpdateListener接口接口函数onAnimationUpdate()要改变View象属性事情该接口do
animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//do your work
}
});
(2)ObjectAnimator:继承自ValueAnimator要指定象及该象属性属性值计算完自设置该象相应属性即完Property Animation全部两步操作实际应用般都用ObjectAnimator改变某象某属性用ObjectAnimator定限制要想使用ObjectAnimator应该满足条件:
1.象应该setter函数:set(驼峰命名)
2面例像ofFloat类工场第参数象名第二属性名面参数变参数values…参数设置值假定目值属性值变化范围前值目值获前值该象要相应属性getter:get
3getter其应返值类型应与相应setter参数类型致
ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f);
oa.setDuration(3000);
oa.start();
满足面条件我能乖乖使用ValueAnimator创建画
(3)Animator.AnimatorListener:Animator设置画监听需要重写面四
onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()
我实现AnimatorListenerAdapter处用定义想监听事件用实现每函数却定义空函数体:
anim.addListener(new AnimatorListenerAdapter() {
public void on AnimationEnd(Animator animation){
//do your work
}
});
(4)AnimationSet:组合画共同工作
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();
面代码意思: 首先播放anim1;同播放anim2,anim3,anim4;播放anim5
(5)TimeInterplator:与Tweeninterpolator类似几种
AccelerateInterpolator 加速始慢间加速
DecelerateInterpolator 减速始快减速
先加速减速始结束慢间加速
AnticipateInterpolator 反向 先向相反向改变段再加速播放
反向加弹先向相反向改变再加速播放超目值缓慢移至目值
BounceInterpolator 跳跃快目值值跳跃目值100面值能依8577708090100
CycleIinterpolator 循环画循环定数值改变弦函数:Math.sin(2 * mCycles * Math.PI * input)
LinearInterpolator 线性线性均匀改变
OvershottInterpolator 弹超目值缓慢改变目值
TimeInterpolator 接口允许自定义interpolator几都实现接口
(6)Keyframes:让我定义除始结束外关键帧KeyFrame抽象类要通ofInt(),ofFloat(),ofObject()获适KeyFrame通PropertyValuesHolder.ofKeyframe获PropertyValuesHolder象:
Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);
述代码意思:设置btn象width属性值使其:始 Width=400画始1/4 Width=200画始1/2 Width=400画始3/4 Width=100画结束 Width=500
(7)ViewPropertyAnimator:View同改变种属性非推荐用种该类属性画进行优化合并些invalidate()减少刷新视图且使用起非简便要求API LEVEL 12即Android 3.1仅需要行代码即完水平、竖直移
myView.animate().translationX(50f). translationY(100f);
(8)需要改变些属性:
translationX,translationY: View相于原始位置偏移量
rotation,rotationX,rotationY: 旋转rotation用于2D旋转角度3D用两
scaleX,scaleY: 缩放比
x,y: View终坐标Viewlefttop位置加translationXtranslationY
alpha: 透明度
四、自总结三种画优缺点:
(1)Frame Animation(帧画)主要用于播放帧帧准备图片类似GIF图片优点使用简单便、缺点需要事先准备每帧图片;
(2)Tween Animation(补间画)仅需定义始与结束关键帧变化间帧由系统补优点用准备每帧缺点改变象绘制没改变View本身属性改变按钮位置需要点击原按钮所位置才效
(3)Property Animation(属性画)3.0推画优点使用简单、降低实现复杂度、直接更改象属性、几乎适用于任何象仅非View类缺点需要3.0API支持限制较目前外源库提供低版本支持
‘伍’ android 如何向drawable导入图片
复制那张图片 然后选中你要复制进去的目录然后ctrl+v就行了。
‘陆’ 怎样让android应用启动gif动起来
1-把GifView.jar加入你的项目。
2-在xml中配置GifView的基本属性,GifView继承自View类,和Button、ImageView一样是一个UI控件。如:
view plain to clipboardprint <com.ant.liao.GifView android:id="@+id/gif2"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" /$amp;>amp;$nbsp;
<com.ant.liao.GifView android:id="@+id/gif2"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:paddingTop="4px" android:paddingLeft="14px" android:enabled="false" />
3-在代码中配置常用属性:
view plain to clipboardprint // 从xml中得到GifView的句柄
gf1 = (GifView) findViewById(R.id.gif1);
// 设置Gif图片源
gf1.setGifImage(R.drawable.gif1);
// 添加监听器
gf1.setOnClickListener(this);
// 设置显示的大小,拉伸或者压缩
gf1.setShowDimension(300, 300);
// 设置加载方式:先加载后显示、边加载边显示、只显示第一帧再显示
gf1.setGifImageType(GifImageType.COVER);
// 从xml中得到GifView的句柄
gf1 = (GifView) findViewById(R.id.gif1);
// 设置Gif图片源
gf1.setGifImage(R.drawable.gif1);
// 添加监听器
gf1.setOnClickListener(this);
// 设置显示的大小,拉伸或者压缩
gf1.setShowDimension(300, 300);
// 设置加载方式:先加载后显示、边加载边显示、只显示第一帧再显示
gf1.setGifImageType(GifImageType.COVER);
GifView的Jar包共有四个类:
GifAction.java
观察者类,监视GIF是否加载成功
GifFrame.java
里面三个成员:当前图片、延时、下张Frame的链接。
GifDecoder.java
解码线程类
GifView.java
主类,包括常用方法,如GifView构造方法、设置图片源、延迟、绘制等。
‘柒’ android 判断drawable资源文件是不是gif
png