JMR*_*ies 11 android android-glide
我正在寻找采用Glide库代替Universal Image Loader,但我遇到了关于共享元素转换的问题.
在我简单的Sandbox中,我使用UIL创建了以下转换:https://dl.dropboxusercontent.com/u/97787025/device-2015-06-18-113333.mp4
非常简单,它工作正常.但是当我使用Glide时,它看起来并不那么好:https://dl.dropboxusercontent.com/u/97787025/device-2015-06-18-114508.mp4
这是我正在使用的代码
第一项活动:
public class MainActivity extends BaseActivity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
final ImageView iv = (ImageView) findViewById(R.id.main_image);
displayImageGlide(BaseActivity.IMAGE_URL, iv, true);
Button button = (Button) findViewById(R.id.main_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), DifferentActivity.class);
startActivity(intent, iv);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
第二个:
public class DifferentActivity extends BaseActivity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.different);
ImageView imageView = (ImageView) findViewById(R.id.diff_image);
displayImageGlide(BaseActivity.IMAGE_URL, imageView, false);
}
}
Run Code Online (Sandbox Code Playgroud)
BaseActivity只包含 displayImageGlide
public void displayImageGlide(String url, ImageView imageView) {
Glide.with(this).load(url)
.asBitmap().transform(new CustomTransformation(this))
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
}
private static class CustomTransformation extends BitmapTransformation {
public CustomTransformation(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return bitmapChanger(toTransform, outWidth, outHeight);
}
@Override
public String getId() {
return "some_id_1";
}
}
private static Bitmap bitmapChanger(Bitmap bitmap, int desiredWidth, int desiredHeight) {
float originalWidth = bitmap.getWidth();
float originalHeight = bitmap.getHeight();
float scaleX = desiredWidth / originalWidth;
float scaleY = desiredHeight / originalHeight;
//Use the larger of the two scales to maintain aspect ratio
float scale = Math.max(scaleX, scaleY);
Matrix matrix = new Matrix();
matrix.setScale(scale, scale);
//If the scaleY is greater, we need to center the image
if(scaleX < scaleY) {
float tx = (scale * originalWidth - desiredWidth) / 2f;
matrix.postTranslate(-tx, 0f);
}
Bitmap result = Bitmap.createBitmap(desiredWidth, desiredHeight, bitmap.getConfig() != null ? bitmap.getConfig() : Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(bitmap, matrix, new Paint());
return result;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试从Glide构建器中删除缓存行(用于阻止它缓存我正在尝试调整的内容),但这没有帮助.愿意采用Glide,但如果这不起作用,那将是一种交易破坏.如果有人有一些意见我会很感激,谢谢!
Rod*_*ito 11
我尝试了你的代码,得到了相同的结果,然后我尝试了另外一个实现:https://github.com/codepath/android_guides/wiki/Shared-Element-Activity-Transition
并做了一些改变,我认为这是关键:
应该在ImageView上设置centerCrop,如果我们使用Glide设置它会导致同样的错误. activity_main.xml中
<ImageView
android:id="@+id/ImageView"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_centerInParent="true"
android:transitionName="detail_image"
android:scaleType="centerCrop"
/>
Run Code Online (Sandbox Code Playgroud)
BaseActivity.java 在MainActivity上,dontTransform应该为true,而在DifferentActivity上为false.
public void displayImageGlide(String url, ImageView imageView, Boolean dontTransform) {
if (dontTransform) {
Glide.with(this).load(url)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.dontTransform()
.into(imageView);
return;
}
Glide.with(this).load(url)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
}
Run Code Online (Sandbox Code Playgroud)
编辑,看看它的外观: https ://www.dropbox.com/s/30s5l8awxogltls/device-2015-06-23-153153.mp4?dl=0
对于那些正在使用 Glide 处理 SharedElementTransition 的人来说,我认为我找到了一个有效的解决方法,或者至少对我有用。在您的第二个活动或片段中使用以下代码:
postponeEnterTransition();
GlideApp.with(this)
.load(imageToLoad)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
startPostponedEnterTransition();
return false;
}
})
.into(imageView);
Run Code Online (Sandbox Code Playgroud)
如果您的目标 API <21 使用:
supportPostponeEnterTransition();
supportStartPostponedEnterTransition();
Run Code Online (Sandbox Code Playgroud)
希望有帮助!