- 浏览: 688127 次
- 性别:
- 来自: 苏州
最新评论
-
usedlie:
if (flag) { matrix.set(matrix ...
android view的缩放平移简单实现 -
jin290:
简单 快捷 非常棒 可以直接用
android 应用实现微信好友或朋友圈分享 -
貌似掉线:
0是朋友1是朋友圈
android 应用实现微信好友或朋友圈分享 -
zhangzhanlei:
[color=red][/color]
android 应用实现微信好友或朋友圈分享 -
shizhangliao:
android适配多分辨率的小技巧
前段时间做了个项目,有播放gif的需求,
而android展示gif的时候只是播放其第一帧.
主要原理呢,就是通过movie来播放gif的每一帧。
相关代码如下:
attr 属性文件中的配置,可以通过这个来获取到gif图像的值,用于decodestream播放gif
而android展示gif的时候只是播放其第一帧.
主要原理呢,就是通过movie来播放gif的每一帧。
相关代码如下:
package com.em.widget; import java.io.InputStream; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Movie; import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import com.em.R; public class Fsgifview extends ImageView { /** * 默认为1秒 */ private static final int DEFAULT_MOVIE_DURATION = 1000; private int mMovieResourceId; private Movie mMovie; private long mMovieStart; private int mCurrentAnimationTime = 0; private float mLeft; private float mTop; private float mScale; private int mMeasuredMovieWidth; private int mMeasuredMovieHeight; private boolean mVisible = true; // private volatile boolean mPaused = false; public Fsgifview(Context context) { this(context, null); } public Fsgifview(Context context, AttributeSet attrs) { this(context, attrs, R.styleable.FSGifViewStyle_drawablevalue); } public Fsgifview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setViewAttributes(context, attrs, defStyle); } @SuppressLint("NewApi") private void setViewAttributes(Context context, AttributeSet attrs, int defStyle) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } // 从描述文件中读出gif的值,创建出Movie实例 final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.FSGifViewStyle, defStyle, 0); mMovieResourceId = array.getResourceId( R.styleable.FSGifViewStyle_drawablevalue, -1); array.recycle(); if (mMovieResourceId != -1) { //根据设置的gif资源文件获取到moive对象 mMovie = Movie.decodeStream(getResources().openRawResource( mMovieResourceId)); } } /** * 设置gif图资源 * * @param movieResId */ public void setMovieResource(int movieResId) { } @Override public void setImageResource(int resId) { this.mMovieResourceId = resId; InputStream is = getResources().openRawResource(mMovieResourceId); mMovie = Movie.decodeStream(is); //重写setimageResource方法,获取到赋值及时通知播放 requestLayout(); } public void setMovie(Movie movie) { this.mMovie = movie; requestLayout(); } public Movie getMovie() { return mMovie; } public void setMovieTime(int time) { mCurrentAnimationTime = time; invalidate(); } /** * 设置暂停 * * @param paused */ // public void setPaused(boolean paused) { // this.mPaused = paused; // if (!paused) { // mMovieStart = android.os.SystemClock.uptimeMillis() // - mCurrentAnimationTime; // } // invalidate(); // } /** * 判断gif图是否停止了 * * @return */ // public boolean isPaused() { // return this.mPaused; // } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mMovie != null) { int movieWidth = mMovie.width(); int movieHeight = mMovie.height(); int maximumWidth = MeasureSpec.getSize(widthMeasureSpec); float scaleW = (float) movieWidth / (float) maximumWidth; mScale = 1f / scaleW; mMeasuredMovieWidth = maximumWidth; mMeasuredMovieHeight = (int) (movieHeight * mScale); setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight); } else { setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight()); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); mLeft = (getWidth() - mMeasuredMovieWidth) / 2f; mTop = (getHeight() - mMeasuredMovieHeight) / 2f; mVisible = getVisibility() == View.VISIBLE; } @Override protected void onDraw(Canvas canvas) { if (mMovie != null) { // if (!mPaused) { updateAnimationTime(); drawMovieFrame(canvas); invalidateView(); // } else { // drawMovieFrame(canvas); // } } } @SuppressLint("NewApi") private void invalidateView() { if (mVisible) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { postInvalidateOnAnimation(); } else { invalidate(); } } } private void updateAnimationTime() { long now = android.os.SystemClock.uptimeMillis(); // 如果第一帧,记录起始时间 if (mMovieStart == 0) { mMovieStart = now; } // 取出动画的时长 int dur = mMovie.duration(); if (dur == 0) { dur = DEFAULT_MOVIE_DURATION; } // 算出需要显示第几帧 mCurrentAnimationTime = (int) ((now - mMovieStart) % dur); } private void drawMovieFrame(Canvas canvas) { // 设置要显示的帧,绘制即可 mMovie.setTime(mCurrentAnimationTime); canvas.save(Canvas.MATRIX_SAVE_FLAG); canvas.scale(mScale, mScale); mMovie.draw(canvas, mLeft / mScale, mTop / mScale); canvas.restore(); } @SuppressLint("NewApi") @Override public void onScreenStateChanged(int screenState) { super.onScreenStateChanged(screenState); mVisible = screenState == SCREEN_STATE_ON; invalidateView(); } @SuppressLint("NewApi") @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); mVisible = visibility == View.VISIBLE; invalidateView(); } @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); mVisible = visibility == View.VISIBLE; invalidateView(); } }
attr 属性文件中的配置,可以通过这个来获取到gif图像的值,用于decodestream播放gif
<declare-styleable name="FSGifViewStyle"> <attr name="drawablevalue" format="reference" /> </declare-styleable>
发表评论
-
jar包混淆
2016-09-18 16:46 1073开发过程中需要把相关功能打成jar包供别人调用,如果不混淆的话 ... -
项目从eclipse移植到studio中遇到的问题整理
2016-09-13 17:42 1135概念 eclipse workspace ---> ... -
ViewGroup&View&Activity onInterceptTouchEvent&dispatchTouchEvent&onTouch整理
2016-08-03 22:26 626一直对这块的知识一知 ... -
仿京东android客户端收件地址选择
2016-07-12 18:07 6463纯手写,可能有些问题,功能已实现 activity pac ... -
FragmentActivity中资源被回收,导致页面fragment错乱的问题
2016-06-07 13:59 3793开发过程中,页面使用fragmentactivity,可能会遇 ... -
android 通过eclipse mat来监测应用内存
2016-02-03 13:02 011dasdasdas -
【转】详解ViewPager调用FragmentPagerAdapter.notifyDataSetChanged()不能更新Fragment
2016-01-30 13:27 2011转载自 http://www.blog4app.com/?p= ... -
startActivityForResult常用使用方式
2015-04-24 11:58 1676示例 初始Activity启动目标activity,并带上了请 ... -
在android4.4以上版本 第三方应用处理短信的疑惑
2015-03-31 16:14 979最近有个处理android手机短信的需求,需要删除本地某指定短 ... -
Beacon的入门相关知识整理(关于android开发)
2014-10-27 16:53 0To do.... -
[转]常用Github项目类库
2014-09-18 09:29 1748【转自】http://blog.csdn.net/jabony ... -
android适配多分辨率的小技巧
2014-09-05 18:10 2755android多分辨率适配其实是老生常谈的话了,今天再拿出来炒 ... -
android通过自定义schame和host来启动app
2014-08-15 15:02 2116很多时候,我们可以看到在web页面中点击链接,可以直接启动ap ... -
基础知识整理
2014-08-08 17:50 0onTouch(MotionEvent event) eve ... -
android view的缩放平移简单实现
2014-07-22 16:20 16316参考了下网上一些实现 主要是通过matrix实现的 用到的 ... -
android 应用实现微信好友或朋友圈分享
2014-07-18 16:44 60383官方的文档连接:https://open.weixin.qq. ... -
android中自定义attr,以及style杂谈
2014-06-05 18:12 13703attr 属性 style 样式 二者都是在res/value ... -
ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
2014-05-20 11:20 1128最近在做android类似slidemenu项目,遇到了scr ... -
获取手机网络状态的代码
2014-03-27 16:45 1255之前网上有人使用方法判断手机网络状态代码如下: Co ... -
[转]android onNewIntent
2014-02-18 15:12 815在Android应用程序开发的时候,从一个Activity启动 ...
相关推荐
本篇文章主要介绍了Android自定义View播放Gif动画的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在我们从Android小学生 进阶到 Android中学生的路上,肯定需要经历 自定义View。 大神已经给出了,最精简的Demo,我这里 顺水推舟,把一些基础知识 标记在代码之中,各位可以一边看源码 一边学基础。 觉得文章有用,...
自定义View用于指示应用开始界面的index. 方便扩展,有兴趣的可以做成GIF的View
使用自定义个view,实现了圆圈的动态展示加载的数据
Android是不能播放gif动画的,所以我们经常用图片轮播代替,但是在xml文件中写播放图片时,不能很好地控制播放和停止,所以这里就自定义了一个Gif播放的view,可以播放、停止、添加播放源和设置播放时间间隔。
android-gif-drawable 支持fig显示的view.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
一个最简单的自定义view,能够显示gif图片 见博客地址: 《【Android实战】记录自学自定义GifView过程,详解属性那些事!》 本项目仍有不成熟的地方,比如只支持gif图片,不支持其他格式图片,建议把本项目作为学习...
首先看看效果图(录制的gif有点卡,真实的效果还是很流畅的) 实现思路 通过上面的gif图可以得出结论,其实它就是同时绘制两条文本信息,然后通过动画不断的改变两条文本信息距离顶部的高度,以此来实现滚动的效果...
我们先来看看最终实现的效果是怎样的(gif效果有点差): 从上面的图片,我们可以看出: ①当加速球View显示的时候,进度条以及百分比数字会从0%开始增加到某一数值(60%)。 ②进度条停止增加后,中间的圆沿着Y...
android-gif-drawable 支持fig显示的view.zip AndroidWheel Android Wheel支持城市、多种日期时间、密码、图片.zip Android滑动选择控件WheelView,双级联动,有图有真相.rar Crouton 丰富样式的Toast.zip ...
自定义对话框LoadingDialog和Toast,可以添加Gif动画的Dialog,喜欢的自行下载!
自定义View——支持设置画笔颜色,画笔宽度,画板颜色,清除画板,检查是否有签名,保存画板图片(复制粘贴可直接使用) /** * Created by YyyyQ on 2020/3/5. * 电子签名 */ public class SignatureView ...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
先自定义一个View,继承自LinearLayout,在Layout中,添加布局控件 /** * Created by xiedong on 2017/3/7. */ public class Loading_view extends LinearLayout { private Context mContext; private ...
利用自定义view在Android上显示GIF动态图。
android gif图片显示,自定义view
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
但是竖直的跑马灯效果原生Android是不支持的。网上也有很多网友实现了自定义的效果,但是我一贯是不喜欢看别人的代码,所以这篇博客的思路完全是我自己的想法哈。 首先,我们需要给自定义的控件梳理一下格局,如...
在Android中全屏显示GIF图片(演示代码),详细内容请参考:http://blog.csdn.net/u012939909/article/details/77418173