#今年三月份直接上手做的android,代碼寫的不規范,有問題希望指出,謝謝(app數英)
類似于微信 圖片瀏覽的效果,我的做法是在兩個activity A\B之間傳遞圖片的位置信息
思路:在activity A的list view上有一張圖片,通過方法獲取到此image view相對于 window 的坐標(也就是 距離手機屏幕上側和左側的距離),然后將這些參數傳遞給 activity B,此時activity B創建一個 image view,image view的寬高是 activity A 里點擊的圖片的寬高,然后設置 margin left margin top,此時就造成一種假象(activity a 的圖片直接傳遞到了 activity B),下面就是 縮放代碼
注意:根據你的代碼 可能 activity a 里邊計算出來的 上側距離可能要減去 活著加上 狀態條的高度,具體根據個人代碼判斷。
上邊的 gif 只是粗略的演示,如有疑問,可以留言 一同解決
下邊是部分主要代碼:
#activity A
//獲取上邊距,左邊距,以及圖片寬高
//可能幾個人計算出的margintop要減去 狀態欄高度
int[] position = new int[2];
headerImageV.getLocationInWindow(position);
int margin_top = position[1];
int margin_left = position[0];
int width = headerImageV.getWidth();
int height = headerImageV.getHeight();
Intent intent = new Intent(getActivity(), EnlargeimagevActivity.class);
intent.putExtra(EnlargeimagevActivity.IMG_URL, personModel.getAvatar_320());startActivity(intent);
//由于是在已發布的項目上更改的代碼,我這只是簡單的演示, 所以沒有做參數傳遞, 直接在b頁面寫死的
#activity B
//由于我使用的第三方庫 PhotoView(處理圖片放大縮小),實際上我的圖片并不是正方形(我這邊放大的圖片和手機的比例一樣),所以下邊高度及 縮放比例的計算會出現不同
final int width = 495;
final int height = (int)((float)Constant.getScreenHeight(this)/Constant.getScreenWidth(this) * width);
final int mar_left = 45;
final int mar_top = 1030;
RelativeLayout.LayoutParams para = new RelativeLayout.LayoutParams(width, height);
para.leftMargin = mar_left;
para.topMargin = mar_top - (height/2 - width/2);
layout.addView(bigImage, para);
//水平 和 豎直方向上的 偏轉量,一定要設置
bigImage.setPivotX(0f);
bigImage.setPivotY(0f);
final float startScale = (float)width / Constant.getScreenWidth(this);
final float startHeightScale = ((float)height / Constant.getScreenHeight(this));
//AnimationSet提供了一個把多個動畫組合成一個組合的機制,并可設置組中動畫的時序關系,如同時播放,順序播放等
//解釋,2秒內 bigimage 的x由 mar_left 到0;
//bigimage的y由mar_top到0;
//然后縮放比例
//起初我寫的是//with(ObjectAnimator.ofFloat(bigImage,View.SCALE_X,startScale,1f)).
//發現并沒有效果, 我一直以為 最大只能1f,后來實驗下才知道
//如有錯誤,請指出
AnimatorSet set = new AnimatorSet();
set.play(ObjectAnimator.ofFloat(bigImage,View.X,mar_left,0)).
with(ObjectAnimator.ofFloat(bigImage, View.Y, mar_top - (height / 2 - width / 2), 0)).
with(ObjectAnimator.ofFloat(bigImage,View.SCALE_X,startScale*(1/startScale),1f*(1/startScale))).
with(ObjectAnimator.ofFloat(bigImage, View.SCALE_Y, startHeightScale * (1 / startHeightScale), 1f * (1 / startHeightScale)));
set.setDuration(2000);
set.setInterpolator(new DecelerateInterpolator());
set.start();
//點擊縮小,返回 activity A
Constant.bindImage(bigImage, imgurl, false);
bigImage.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
@Override
public void onPhotoTap(View view, float x, float y) {
AnimatorSet set = new AnimatorSet();
set.play(ObjectAnimator.ofFloat(bigImage,View.X,0,mar_left)).
with(ObjectAnimator.ofFloat(bigImage,View.Y, 0,mar_top - (height/2 - width/2))).
with(ObjectAnimator.ofFloat(bigImage,View.SCALE_X,1f*(1/startScale),startScale*(1/startScale))).
with(ObjectAnimator.ofFloat(bigImage,View.SCALE_Y,1f*(1/startHeightScale),startHeightScale*(1/startHeightScale)));
set.setDuration(2000);
set.setInterpolator(new DecelerateInterpolator());
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
finish();
overridePendingTransition(R.anim.slide_other, R.anim.slide_other);
}
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
}
});
set.start();
}});