|
@@ -4,13 +4,18 @@ import android.annotation.SuppressLint;
|
|
|
import android.content.Context;
|
|
|
import android.graphics.Bitmap;
|
|
|
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.owncloud.android.datamodel.OCFile;
|
|
|
import com.owncloud.android.lib.common.utils.Log_OC;
|
|
|
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.InputStream;
|
|
|
+
|
|
|
public class ImageViewCustom extends ImageView {
|
|
|
|
|
|
private static final String TAG = ImageViewCustom.class.getSimpleName();
|
|
@@ -23,7 +28,12 @@ public class ImageViewCustom extends ImageView {
|
|
|
private int mBitmapHeight;
|
|
|
private int mBitmapWidth;
|
|
|
|
|
|
-
|
|
|
+ private Movie mGifMovie;
|
|
|
+ private int mMovieWidth, mMovieHeight;
|
|
|
+ private long mMovieDuration;
|
|
|
+ private long mMovieRunDuration;
|
|
|
+ private long mLastTick;
|
|
|
+
|
|
|
public ImageViewCustom(Context context) {
|
|
|
super(context);
|
|
|
}
|
|
@@ -39,18 +49,60 @@ public class ImageViewCustom extends ImageView {
|
|
|
@SuppressLint("NewApi")
|
|
|
@Override
|
|
|
protected void onDraw(Canvas canvas) {
|
|
|
-
|
|
|
if(IS_ICS_OR_HIGHER && checkIfMaximumBitmapExceed(canvas) || IS_VERSION_BUGGY_ON_RECYCLES ) {
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
|
|
|
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
|
|
}
|
|
|
|
|
|
- super.onDraw(canvas);
|
|
|
+ if(mGifMovie != null) {
|
|
|
+ long nowTick = android.os.SystemClock.uptimeMillis();
|
|
|
+ if (mLastTick == 0) {
|
|
|
+ mMovieRunDuration = 0;
|
|
|
+ } else {
|
|
|
+ mMovieRunDuration += nowTick - mLastTick;
|
|
|
+ if(mMovieRunDuration > mMovieDuration) {
|
|
|
+ mMovieRunDuration = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mGifMovie.setTime((int) mMovieRunDuration);
|
|
|
+
|
|
|
+ float scale = getScaleToViewFactor(mGifMovie, canvas);
|
|
|
+
|
|
|
+ canvas.scale(scale, scale);
|
|
|
+ canvas.translate(((float) getWidth() / scale - (float) mGifMovie.width()) / 2f,
|
|
|
+ ((float) getHeight() / scale - (float) mGifMovie.height()) /2f);
|
|
|
+
|
|
|
+ mGifMovie.draw(canvas, 0, 0);
|
|
|
+
|
|
|
+ mLastTick = nowTick;
|
|
|
+ invalidate();
|
|
|
+ } else {
|
|
|
+ super.onDraw(canvas);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private float getScaleToViewFactor(Movie movie, Canvas canvas) {
|
|
|
+ if (movie.height() > getHeight() || movie.width() > getWidth()) {
|
|
|
+ float offset = 0.25f;
|
|
|
+ return (1f / Math.min(canvas.getHeight() / movie.height(), canvas.getWidth() / movie.width())) + offset;
|
|
|
+ }
|
|
|
+
|
|
|
+ return Math.min(canvas.getHeight() / movie.height(), canvas.getWidth() / movie.width());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
|
+ if (mGifMovie == null) {
|
|
|
+ setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
|
|
|
+ } else {
|
|
|
+ setMeasuredDimension(mMovieWidth, mMovieHeight);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -60,24 +112,40 @@ public class ImageViewCustom extends ImageView {
|
|
|
*/
|
|
|
@SuppressLint("NewApi")
|
|
|
private boolean checkIfMaximumBitmapExceed(Canvas canvas) {
|
|
|
- Log_OC.v(TAG, "Canvas maximum: " + canvas.getMaximumBitmapWidth() + " - " + canvas.getMaximumBitmapHeight());
|
|
|
- if (mBitmapWidth > canvas.getMaximumBitmapWidth()
|
|
|
- || mBitmapHeight > canvas.getMaximumBitmapHeight()) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
+ return mBitmapWidth > canvas.getMaximumBitmapWidth()
|
|
|
+ || mBitmapHeight > canvas.getMaximumBitmapHeight();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
|
|
|
- * Keeps the size of the bitmap cached in member variables for faster access in {@link #onDraw(Canvas)} ,
|
|
|
+ * Keeps the size of the bitmap cached in member variables for faster access in {@link #onDraw(Canvas)},
|
|
|
* but without keeping another reference to the {@link Bitmap}
|
|
|
*/
|
|
|
- public void setImageBitmap (Bitmap bm) {
|
|
|
+ public void setImageBitmap(Bitmap bm) {
|
|
|
mBitmapWidth = bm.getWidth();
|
|
|
mBitmapHeight = bm.getHeight();
|
|
|
super.setImageBitmap(bm);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * sets the GIF image of the given storage path.
|
|
|
+ *
|
|
|
+ * @param storagePath the storage path of the GIF image
|
|
|
+ */
|
|
|
+ public void setGIFImageFromStoragePath(String storagePath) {
|
|
|
+ try {
|
|
|
+ InputStream gifInputStream = new FileInputStream(storagePath);
|
|
|
+ setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
|
|
+ setFocusable(true);
|
|
|
+
|
|
|
+ mGifMovie = Movie.decodeStream(gifInputStream);
|
|
|
+ mMovieWidth = mGifMovie.width();
|
|
|
+ mMovieHeight = mGifMovie.height();
|
|
|
+ mMovieDuration = mGifMovie.duration();
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log_OC.e(TAG, "Failed to set GIF image");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|