mirror of
https://github.com/nextcloud/android.git
synced 2024-11-25 22:55:46 +03:00
add support for showing animated gifs in imagePreview
This commit is contained in:
parent
0768bd9ff7
commit
86b92a1753
2 changed files with 75 additions and 13 deletions
|
@ -4,13 +4,18 @@ import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Movie;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import com.owncloud.android.datamodel.OCFile;
|
||||||
import com.owncloud.android.lib.common.utils.Log_OC;
|
import com.owncloud.android.lib.common.utils.Log_OC;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
public class ImageViewCustom extends ImageView {
|
public class ImageViewCustom extends ImageView {
|
||||||
|
|
||||||
private static final String TAG = ImageViewCustom.class.getSimpleName();
|
private static final String TAG = ImageViewCustom.class.getSimpleName();
|
||||||
|
@ -23,6 +28,11 @@ public class ImageViewCustom extends ImageView {
|
||||||
private int mBitmapHeight;
|
private int mBitmapHeight;
|
||||||
private int mBitmapWidth;
|
private int mBitmapWidth;
|
||||||
|
|
||||||
|
private Movie gifMovie;
|
||||||
|
private int movieWidth, movieHeight;
|
||||||
|
private long movieDuration;
|
||||||
|
private long movieRunDuration;
|
||||||
|
private long lastTick;
|
||||||
|
|
||||||
public ImageViewCustom(Context context) {
|
public ImageViewCustom(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
@ -39,18 +49,54 @@ public class ImageViewCustom extends ImageView {
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Override
|
@Override
|
||||||
protected void onDraw(Canvas canvas) {
|
protected void onDraw(Canvas canvas) {
|
||||||
|
|
||||||
if(IS_ICS_OR_HIGHER && checkIfMaximumBitmapExceed(canvas) || IS_VERSION_BUGGY_ON_RECYCLES ) {
|
if(IS_ICS_OR_HIGHER && checkIfMaximumBitmapExceed(canvas) || IS_VERSION_BUGGY_ON_RECYCLES ) {
|
||||||
// Software type is set with two targets:
|
// Software type is set with two targets:
|
||||||
// 1. prevent that bitmaps larger than maximum textures allowed are shown as black views in devices
|
// 1. prevent that bitmaps larger than maximum textures allowed are shown as black views in devices
|
||||||
// with LAYER_TYPE_HARDWARE enabled by default;
|
// with LAYER_TYPE_HARDWARE enabled by default;
|
||||||
// 2. grant that bitmaps are correctly dellocated from memory in versions suffering the bug fixed in
|
// 2. grant that bitmaps are correctly de-allocated from memory in versions suffering the bug fixed in
|
||||||
// https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0;
|
// https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0;
|
||||||
//
|
//
|
||||||
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onDraw(canvas);
|
if(gifMovie == null){
|
||||||
|
super.onDraw(canvas);
|
||||||
|
} else {
|
||||||
|
long nowTick = android.os.SystemClock.uptimeMillis();
|
||||||
|
if (lastTick == 0) {
|
||||||
|
movieRunDuration = 0;
|
||||||
|
} else {
|
||||||
|
movieRunDuration += nowTick -lastTick;
|
||||||
|
if(movieRunDuration > movieDuration){
|
||||||
|
movieRunDuration = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gifMovie.setTime((int) movieRunDuration);
|
||||||
|
|
||||||
|
float scale;
|
||||||
|
if(gifMovie.height() > getHeight() || gifMovie.width() > getWidth()) {
|
||||||
|
scale = (1f / Math.min(canvas.getHeight() / gifMovie.height(),
|
||||||
|
canvas.getWidth() / gifMovie.width())) + 0.25f;
|
||||||
|
} else {
|
||||||
|
scale = Math.min(canvas.getHeight() / gifMovie.height(),
|
||||||
|
canvas.getWidth() / gifMovie.width());
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.scale(scale, scale);
|
||||||
|
canvas.translate(((float) getWidth() / scale - (float) gifMovie.width()) / 2f,
|
||||||
|
((float) getHeight() / scale - (float) gifMovie.height()) /2f);
|
||||||
|
|
||||||
|
gifMovie.draw(canvas, 0, 0);
|
||||||
|
|
||||||
|
lastTick = nowTick;
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
setMeasuredDimension(movieWidth, movieHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,13 +106,9 @@ public class ImageViewCustom extends ImageView {
|
||||||
*/
|
*/
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
private boolean checkIfMaximumBitmapExceed(Canvas canvas) {
|
private boolean checkIfMaximumBitmapExceed(Canvas canvas) {
|
||||||
Log_OC.v(TAG, "Canvas maximum: " + canvas.getMaximumBitmapWidth() + " - " + canvas.getMaximumBitmapHeight());
|
return mBitmapWidth > canvas.getMaximumBitmapWidth()
|
||||||
if (mBitmapWidth > canvas.getMaximumBitmapWidth()
|
|| mBitmapHeight > canvas.getMaximumBitmapHeight();
|
||||||
|| mBitmapHeight > canvas.getMaximumBitmapHeight()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -74,10 +116,25 @@ public class ImageViewCustom extends ImageView {
|
||||||
* 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}
|
* but without keeping another reference to the {@link Bitmap}
|
||||||
*/
|
*/
|
||||||
public void setImageBitmap (Bitmap bm) {
|
public void setImageBitmap(Bitmap bm) {
|
||||||
mBitmapWidth = bm.getWidth();
|
mBitmapWidth = bm.getWidth();
|
||||||
mBitmapHeight = bm.getHeight();
|
mBitmapHeight = bm.getHeight();
|
||||||
super.setImageBitmap(bm);
|
super.setImageBitmap(bm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setGifImage(OCFile file){
|
||||||
|
try {
|
||||||
|
InputStream gifInputStream = new FileInputStream(file.getStoragePath());
|
||||||
|
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
||||||
|
setFocusable(true);
|
||||||
|
|
||||||
|
gifMovie = Movie.decodeStream(gifInputStream);
|
||||||
|
movieWidth = gifMovie.width();
|
||||||
|
movieHeight = gifMovie.height();
|
||||||
|
movieDuration = gifMovie.duration();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -504,7 +504,12 @@ public class PreviewImageFragment extends FileFragment {
|
||||||
imageView.setBackground(backrepeat);
|
imageView.setBackground(backrepeat);
|
||||||
}
|
}
|
||||||
|
|
||||||
imageView.setImageBitmap(bitmap);
|
if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")){
|
||||||
|
imageView.setGifImage(result.ocFile);
|
||||||
|
} else {
|
||||||
|
imageView.setImageBitmap(bitmap);
|
||||||
|
}
|
||||||
|
|
||||||
imageView.setVisibility(View.VISIBLE);
|
imageView.setVisibility(View.VISIBLE);
|
||||||
mBitmap = bitmap; // needs to be kept for recycling when not useful
|
mBitmap = bitmap; // needs to be kept for recycling when not useful
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue