- 浏览: 693037 次
- 性别:
- 来自: 苏州
最新评论
-
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 1123开发过程中需要把相关功能打成jar包供别人调用,如果不混淆的话 ... -
项目从eclipse移植到studio中遇到的问题整理
2016-09-13 17:42 1164概念 eclipse workspace ---> ... -
ViewGroup&View&Activity onInterceptTouchEvent&dispatchTouchEvent&onTouch整理
2016-08-03 22:26 670一直对这块的知识一知 ... -
仿京东android客户端收件地址选择
2016-07-12 18:07 6511纯手写,可能有些问题,功能已实现 activity pac ... -
FragmentActivity中资源被回收,导致页面fragment错乱的问题
2016-06-07 13:59 3858开发过程中,页面使用fragmentactivity,可能会遇 ... -
android 通过eclipse mat来监测应用内存
2016-02-03 13:02 011dasdasdas -
【转】详解ViewPager调用FragmentPagerAdapter.notifyDataSetChanged()不能更新Fragment
2016-01-30 13:27 2050转载自 http://www.blog4app.com/?p= ... -
startActivityForResult常用使用方式
2015-04-24 11:58 1711示例 初始Activity启动目标activity,并带上了请 ... -
在android4.4以上版本 第三方应用处理短信的疑惑
2015-03-31 16:14 1030最近有个处理android手机短信的需求,需要删除本地某指定短 ... -
Beacon的入门相关知识整理(关于android开发)
2014-10-27 16:53 0To do.... -
[转]常用Github项目类库
2014-09-18 09:29 1792【转自】http://blog.csdn.net/jabony ... -
android适配多分辨率的小技巧
2014-09-05 18:10 2815android多分辨率适配其实是老生常谈的话了,今天再拿出来炒 ... -
android通过自定义schame和host来启动app
2014-08-15 15:02 2168很多时候,我们可以看到在web页面中点击链接,可以直接启动ap ... -
基础知识整理
2014-08-08 17:50 0onTouch(MotionEvent event) eve ... -
android view的缩放平移简单实现
2014-07-22 16:20 16356参考了下网上一些实现 主要是通过matrix实现的 用到的 ... -
android 应用实现微信好友或朋友圈分享
2014-07-18 16:44 60438官方的文档连接:https://open.weixin.qq. ... -
android中自定义attr,以及style杂谈
2014-06-05 18:12 13752attr 属性 style 样式 二者都是在res/value ... -
ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
2014-05-20 11:20 1160最近在做android类似slidemenu项目,遇到了scr ... -
获取手机网络状态的代码
2014-03-27 16:45 1294之前网上有人使用方法判断手机网络状态代码如下: Co ... -
[转]android onNewIntent
2014-02-18 15:12 846在Android应用程序开发的时候,从一个Activity启动 ...
相关推荐
总的来说,Android自定义View播放GIF动画涉及到`Movie`类的使用,以及自定义View的基本原理,包括`onDraw`方法的重写和事件监听。这种方法适合对GIF动画有特殊需求的项目,通过这种方式,我们可以更好地控制GIF的...
"Android自定义View指示图标"是这个话题的核心,它涉及到在Android应用程序的启动界面创建一个指示器,可能用于展示加载状态、页面索引或是导航指示。这种自定义View的设计通常是为了提供更直观的用户体验,使用户...
在我们从Android小学生 进阶到 Android中学生的路上,肯定需要经历 自定义View。 大神已经给出了,最精简的Demo,我这里 顺水推舟,把一些基础知识 标记在代码之中,各位可以一边看源码 一边学基础。 觉得文章有用,...
在这个自定义View中,我们将使用`GifDrawable`来加载和播放GIF。 ```java public class GifTextView extends TextView { private GifDrawable gifDrawable; public GifTextView(Context context) { super...
3. **设计布局**:在res/layout目录下创建一个dialog_loading.xml布局文件,添加一个可以显示GIF的ImageView或自定义View,如`androidx.appcompat.widget.AppCompatImageView`。设置其`android:src`属性为空,因为...
3. **自定义View**:由于Android默认的ImageView不支持GIF动画,因此需要创建一个继承自View的类,重写onDraw()方法来实现GIF的绘制。 4. **加载GIF数据**:Android系统并没有内置的库来解析GIF,所以我们需要引入...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有创意的用户界面。自定义View不仅可以满足特定的交互需求,还能通过动画效果提升用户体验。本篇将深入探讨如何在Android中创建自定义View...
在Android开发中,自定义View是提升应用独特性和用户体验的重要手段。标题提到的"自定义view圆圈实现动态的显示进度",意味着我们要探讨的是如何创建一个自定义的圆形进度条,它能够实时反映数据加载的进度。这个...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,提升应用的用户体验。本文将详细解析如何实现一个动态炫酷的自定义按钮,结合描述和标签,我们可以从以下几个关键知识...
在Android开发中,有时我们需要对GIF图片进行特殊处理或者集成到我们的应用中,而系统默认的ImageView并不支持GIF格式。在这种情况下,我们就需要创建一个自定义的GIF图片显示控件。本文将深入探讨如何实现这样一个...
在Android开发中,处理动态图像是一个常见的需求,特别是GIF格式的图像,因为它们能够展示动画效果。本文将深入探讨如何使用`pl.droidsonroids.gif:android-gif-drawable`库来实现GIF图片的播放和暂停功能。 首先,...
这个库提供了一个自定义的View,可以无缝集成到你的UI中,让你的应用能够支持动态的GIF内容。 首先,让我们了解一下GIF图片的原理。GIF(Graphics Interchange Format)是一种无损压缩的图像格式,它支持透明度和多...
在Android中,由于原生的ImageView不支持GIF动画,所以我们需要借助第三方库或者自定义View来实现。 1. **使用第三方库**:Android社区提供了多个用于播放GIF的库,例如Glide、Picasso和NineOldAndroids等。其中,...
在Android中,系统默认不支持直接显示GIF格式的图片,因此我们需要借助第三方库来解析和播放GIF。常见的库有NineOldAndroids、Glide、Picasso等,但这些库通常不包含GIF解码功能。本项目可能使用了如GIFDrawable或...
在Android开发中,有时我们需要在TextView中展示动态的GIF图像,而系统默认的TextView并不支持直接播放GIF。...通过这个过程,你不仅可以学习到Android自定义View的基本知识,还能了解到图片处理和动画播放的相关技巧。
在Android中,处理这种格式的图片需要特别的方法,因为默认的ImageView组件并不支持GIF动画。 要实现在Android应用中显示GIF图片,我们可以使用以下几种方法: 1. **利用第三方库**:由于Android原生API对GIF支持...
2. **Android SDK中的GIF支持**:原生的Android SDK并不直接支持加载和播放GIF,但我们可以借助第三方库如`NineOldAndroids`或`Glide`、`Picasso`等来实现。本文将着重讲解自定义组件的方式。 3. **自定义GifView**...
- 为了节省资源,可以使用`GifView`(自定义View)只显示当前帧,而不是一次性加载所有帧。 5. **兼容性** - 考虑到Android系统的碎片化,`GifPlayer`类需要兼容各种API级别,可能需要使用`Support Library`或`...
Android系统本身并不直接支持GIF动画的播放,因此我们需要借助第三方库来处理。常见的库有 Glide、Picasso 和 Android-Universal-Image-Loader 等,但这些库主要用于静态图片加载。对于GIF,我们可以选择使用...