您好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, 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(); } } }
main.xml中
的Manifest.xml
当我运行上面的代码片段时GIF
根本没有运行,但当我删除android:targetSdkVersion="19"
GIF
运行时,请帮我解决这个问题.
谢谢
使用Glide将项目raw
文件夹或外部URL中的任何gif加载到ImageView, ImageButtons
或类似[Glide targets][2]
Glide.with(getActivity()).load(R.raw.alarm).asGif().into(btnAlert);
2017更新的答案
要在Android中使用GIF,请使用Glide库加载任何图像或GIF.
Glide.with(context) .load(YOUR_GIF) .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, 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_ android:layout_ android:layout_gravity="center" />