你好stackoverflow
我正在尝试开发一个android应用程序来播放我自己的GIF
,这里是代码片段
- 主要活动. java**
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
- 动画视图. java**
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.util.AttributeSet;
import android.view.View;
public class AnimationView extends View {
private Movie mMovie;
private long mMovieStart;
private static final boolean DECODE_STREAM = true;
private int mDrawLeftPos;
private int mHeight, mWidth;
private static byte[] streamToBytes(InputStream is) {
ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int len;
try {
while ((len = is.read(buffer)) >= 0) {
os.write(buffer, 0, len);
}
} catch (java.io.IOException e) {
}
return os.toByteArray();
}
public AnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
java.io.InputStream is;
is = context.getResources().openRawResource(R.drawable.scanning);
if (DECODE_STREAM) {
mMovie = Movie.decodeStream(is);
} else {
byte[] array = streamToBytes(is);
mMovie = Movie.decodeByteArray(array, 0, array.length);
}
}
@Override
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec )
{
int p_top = this.getPaddingTop(), p_bottom = this.getPaddingBottom();
mWidth = mMovie.width();
mHeight = mMovie.height();
// Calculate new desired height
final int desiredHSpec = MeasureSpec.makeMeasureSpec( mHeight + p_top + p_bottom , MeasureSpec.EXACTLY );
setMeasuredDimension( widthMeasureSpec, desiredHSpec );
super.onMeasure( widthMeasureSpec, desiredHSpec );
// Update the draw left position
mDrawLeftPos = Math.max( ( this.getWidth() - mWidth ) / 2, 0) ;
}
@Override
public void onDraw(Canvas canvas) {
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0) { // first time
mMovieStart = now;
}
if (mMovie != null) {
int dur = mMovie.duration();
if (dur == 0) {
dur = 3000;
}
int relTime = (int) ((now - mMovieStart) % dur);
// Log.d("", "real time :: " +relTime);
mMovie.setTime(relTime);
mMovie.draw(canvas, mDrawLeftPos, this.getPaddingTop());
invalidate();
}
}
}
- 主文件. xml**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical" >
<com.example.androidgifwork.AnimationView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</LinearLayout>
- 清单. xml**
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidgifwork"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="com.example.androidgifwork.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>
当我运行上面的代码片段GIF
是不是在所有运行,但当我删除android:targetSdkVersion="19"
GIF
运行,请帮助我解决这个谜.
谢谢
9条答案
按热度按时间ryoqjall1#
要在Android中播放GIF,请使用Glide库加载任何图像或GIF。
使用Glide可以加载普通图像、服务器图像甚至GIF。另外,还可以查看Picasso android图像加载库,该库类似于Glide,但截至目前(2017年4月16日)Picasso尚不支持在android中加载GIF。
######################################################################
6l7fqoea2#
使用Glide将项目
raw
文件夹或外部URL中的任何gif加载到ImageView, ImageButtons
或类似的[Glide targets][2]
中fae0ux8s3#
如果你可以使用WebView,GIF将直接在它上面播放。但是我不确定,在你的情况下,你是否想把它放在WebView中。
2w2cym1i4#
将此添加到您的依赖项(build.gradle)
在xml中使用它来显示你的gif
更多信息请访问:https://github.com/koral--/android-gif-drawable
bxfogqkk5#
Android提供了android.graphics.Movie类,这个类能够解码和播放InputStreams,所以对于这种方法,我们创建了一个类GifMovieView,让它继承View,详细教程在http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs-in-android-part-1/
a6b3iqyw6#
源代码https://drive.google.com/open?id=0BzBKpZ4nzNzUZy1BVlZSbExvYUU
android:清单文件中硬件加速=“false”
rseugnpd7#
对于运行API 29(Pie)及以上版本的设备,您可以使用AnimatedImageDrawable播放GIF和WebP动画图像。
下面是一个例子:
使用此选项可提供更多可用于图像的控制和功能,例如:
以及更多
7dl7o3gd8#
你也可以使用Coil库,它对GIF图像的控制比Glide要少一些,但如果你只想加载一次GIF并显示,它仍然提供了简单的实现。如果你想重复这个过程,你需要再次触发drawable或者只是再次调用load函数。无论如何,即使再次调用load,资源也应该被缓存在后台(有待调查,不能100%确定)。Everything you need正在添加依赖项:
并指定解码机制:
这就是所有的前进和加载图像/gif直接在您的图像视图:
不要忘记将所需的图像加载器传递给每个需要使用解码器的请求,例如GIF。或者将自定义imageLoader设置为每个请求的默认值:
e7arh2l69#
Android中的动画GIF是一个很难的主题。这是一个已经被大量讨论过的问题,开发人员仍然很难将GIF赋予生命。使用
glide
和pl.droidsonroids.gif:android-gif-drawable
在构建gradle时遇到了一些问题。所以我找到了一个不使用任何依赖项的方法。我使用这个方法在我的视图中加载GIF:动画图片.java:
在
res/values
文件夹中创建attrs.xml
:将
your.gif
文件复制到src/main/assets/
文件夹中**activity_main.xml:**您可以使用
app:gifSrc
属性作为assets文件夹中存在gif的名称。