你好stackoverflow我正在尝试开发一个
Android应用程序来播放我自己的GIF,这里是代码片段
MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
AnimationView.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,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,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(); } } }
main.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>
的Manifest.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运行,请帮我解决这个谜语.
谢谢
解决方法
2017更新答案
要在Android中玩GIF,请使用 Glide库加载任何图像或GIF.
要在Android中玩GIF,请使用 Glide库加载任何图像或GIF.
Glide.with(context) .load(YOUR_GIF) .asGif() .into(YOUR_IMAGE_VIEW);
使用Glide来加载正常图像,来自服务器的图像甚至加载GIF.还有看看Picasso android图像加载库,它类似于Glide,但截至目前(2017年4月16日)Picasso不支持在Android中的GIF加载.
################################################## ####################
旧答案
对于所有想要在您的应用程序中播放GIF的用户,请查找以下代码
PlayGifView.java
import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Movie; import android.os.Build; import android.util.AttributeSet; import android.view.View; public class PlayGifView extends View{ private static final int DEFAULT_MOVIEW_DURATION = 1000; private int mMovieResourceId; private Movie mMovie; private long mMovieStart = 0; private int mCurrentAnimationTime = 0; @SuppressLint("NewApi") public PlayGifView(Context context,AttributeSet attrs) { super(context,attrs); /** * Starting from HONEYCOMB have to turn off HardWare acceleration to draw * Movie on Canvas. */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setLayerType(View.LAYER_TYPE_SOFTWARE,null); } } public void setImageResource(int mvId){ this.mMovieResourceId = mvId; mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId)); requestLayout(); } @Override protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) { if(mMovie != null){ setMeasuredDimension(mMovie.width(),mMovie.height()); }else{ setMeasuredDimension(getSuggestedMinimumWidth(),getSuggestedMinimumHeight()); } } @Override protected void onDraw(Canvas canvas) { if (mMovie != null){ updateAnimtionTime(); drawGif(canvas); invalidate(); }else{ drawGif(canvas); } } private void updateAnimtionTime() { long now = android.os.SystemClock.uptimeMillis(); if (mMovieStart == 0) { mMovieStart = now; } int dur = mMovie.duration(); if (dur == 0) { dur = DEFAULT_MOVIEW_DURATION; } mCurrentAnimationTime = (int) ((now - mMovieStart) % dur); } private void drawGif(Canvas canvas) { mMovie.setTime(mCurrentAnimationTime); mMovie.draw(canvas,0); canvas.restore(); } }
在您的活动类中,使用以下代码播放GIF
PlayGifView pGif = (PlayGifView) findViewById(R.id.viewGif); pGif.setImageResource(<Your GIF file name Eg: R.drawable.infinity_gif>);
XML布局
<yourPacckageName.PlayGifView android:id="@+id/viewGif" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" />