編輯:關於Android編程
在上一篇,是使用代碼通過構造方法傳入要播放的gif動畫的id進行獲取的。本文進一步改造,讓GifView和ImageView一樣可以在布局文件中設置src屬性,並在GifView中我們使用反射動態獲取src的圖片資源ID,然後對它進行播放。這樣使用起來就靈活多了。代碼如下:
GifView:
package com.home.gifview; import java.io.InputStream; import java.lang.reflect.Field; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Movie; import android.os.SystemClock; import android.util.AttributeSet; import android.util.TypedValue; import android.widget.ImageView; public class GifView extends ImageView { private Movie movie; private long movieStart; private int imageWidth; private int imageHeight; public GifView(Context context) { super(context); } public GifView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public GifView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GifView); int resourceId = getResourceId(a, context, attrs); if (resourceId != 0) { InputStream is = getResources().openRawResource(resourceId); movie = Movie.decodeStream(is); if (movie != null) { Bitmap bitmap = BitmapFactory.decodeStream(is); imageWidth = bitmap.getWidth(); imageHeight = bitmap.getHeight(); bitmap.recycle(); } } } @Override protected void onDraw(Canvas canvas) { if (movie == null) { // 普通圖片則直接調用父類的onDraw()方法 super.onDraw(canvas); } else { playGif(canvas); invalidate(); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (movie != null) { // 如果是gif圖片則定制GifView的大小 setMeasuredDimension(imageWidth, imageHeight); } } /** * 播放gif動畫 * * @param canvas * @return */ private boolean playGif(Canvas canvas) { long now = SystemClock.uptimeMillis(); if (movieStart == 0) { movieStart = now; } int duration = movie.duration(); if (duration == 0) { duration = 1000; } int relTime = (int) ((now - movieStart) % duration); movie.setTime(relTime); movie.draw(canvas, 0, 0); if ((now - movieStart) >= duration) { movieStart = 0; return true; } return false; } /** * 使用反射,獲取到src指定圖片資源所對應的id。 * * @param a * @param context * @param attrs * @return */ private int getResourceId(TypedArray a, Context context, AttributeSet attrs) { try { Field field = TypedArray.class.getDeclaredField("mValue"); field.setAccessible(true); TypedValue typedValueObject = (TypedValue) field.get(a); return typedValueObject.resourceId; } catch (Exception e) { e.printStackTrace(); } finally { if (a != null) { a.recycle(); } } return 0; } }
attrs.xml:
main.xml:
禁用硬件加速:
android:hardwareAccelerated="false"
引言:去年Android 6.0發布後,其新引入的(Requesting Permissions at Run Time)運行時權限就備受開發者關注,隨著今年國內手機廠商
Fragment相當於一個小型activity,因為Fragment可以實現activity中所有的功能,不同的是Fragment可以嵌入activity,一個activ
小demo一個,今天用到了,那麼就分享給大家,希望對大家有所收獲 先上效果圖: 示例源碼: 1.添加訪問sd卡權限 2.源碼 package com
關於滑動效果,在Android中用得比較多,本示例實現的滑動效果是使用ViewFlipper來實現的,當然也可以使用其它的View來實現。接下來就讓我們開始實現這種效果。