Android點選檢視大圖過渡動畫與圖片縮放與移動
阿新 • • 發佈:2019-02-12
從一個activity到另一個activity的過渡
1.小圖點選事件程式碼
@Override public void onClick(View view) { switch (view.getId()) { case R.id.img_1: view.setClickable(false); Intent intentS = new Intent(this, ImageActivity.class); int[] screenLocationS = new int[2]; view.getLocationOnScreen(screenLocationS); intentS.putExtra(LEFT, screenLocationS[0]).//將圖片位置傳到大圖activity用於動畫初始位置 putExtra(TOP, screenLocationS[1]). putExtra(WIDTH, view.getWidth()). putExtra(HEIGHT, view.getHeight()). putExtra(IMAGE, _snapUrl). putExtra(TITLE, _name); startActivity(intentS); overridePendingTransition(0, 0);//取消原有預設的Activity到Activity的過渡動畫 break; case R.id.img_2: view.setClickable(false); Intent intentM = new Intent(this, ImageActivity.class); int[] screenLocationM = new int[2]; view.getLocationOnScreen(screenLocationM); intentM.putExtra(LEFT, screenLocationM[0]).//將圖片位置傳到大圖activity用於動畫初始位置 putExtra(TOP, screenLocationM[1]). putExtra(WIDTH, view.getWidth()). putExtra(HEIGHT, view.getHeight()). putExtra(IMAGE, _matchUrl). putExtra(TITLE, _name); startActivity(intentM); overridePendingTransition(0, 0);//取消原有預設的Activity到Activity的過渡動畫 break; } }
2.大圖Activity程式碼
public class BigImageActivity extends Activity implements View.OnClickListener { private static final int DURATION = 150; public final static String TITLE = "Title"; public final static String TOP = "Top"; public final static String LEFT = "Left"; public final static String WIDTH = "Width"; public final static String HEIGHT = "Height"; public final static String IMAGE = "Image"; private int mLeftDelta; private int mTopDelta; private float mWidthScale; private float mHeightScale; private int intentTop; private int intentLeft; private int intentWidth; private int intentHeight; private LinearLayout linearLayout; private ColorDrawable colorDrawable; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FaceDetectionApp.setWindowTrans(this, true, false); setContentView(R.layout.activity_image); initView(); if (savedInstanceState == null) { ViewTreeObserver observer = imageView.getViewTreeObserver(); observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { imageView.getViewTreeObserver().removeOnPreDrawListener(this); int[] screenLocation = new int[2]; imageView.getLocationOnScreen(screenLocation); mLeftDelta = intentLeft - screenLocation[0]; mTopDelta = intentTop - screenLocation[1]; mWidthScale = (float) intentWidth / imageView.getWidth(); mHeightScale = (float) intentHeight / imageView.getHeight(); enterAnimation(new Runnable() { @Override public void run() { Matrix matrix = imageView.getMatrix(); imageView.setImageMatrix(matrix); imageView.setScaleType(ImageView.ScaleType.MATRIX); imageView.setOnTouchListener(new ImageTouchListener()); } }); return true; } }); } } @Override protected void initView() { super.initView(); linearLayout = findViewById(R.id.ll_img); imageView = findViewById(R.id.img); initValue(); } @Override protected void initValue() { super.initValue(); colorDrawable = new ColorDrawable(ContextCompat.getColor(this, R.color.color_item_background)); linearLayout.setBackground(colorDrawable); Bundle bundle = getIntent().getExtras(); if (bundle != null) { title = bundle.getString(TITLE); intentTop = bundle.getInt(TOP); intentLeft = bundle.getInt(LEFT); intentWidth = bundle.getInt(WIDTH); intentHeight = bundle.getInt(HEIGHT); String imgURL = bundle.getString(IMAGE); asyncLoadImageSmallList(imageView, imgURL);//框架程式碼 不解釋 imageView.setOnClickListener(this); } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.img: view.setClickable(false); exitAnimation(new Runnable() { public void run() { finish(); overridePendingTransition(0, 0); } }); break; } } @Override public void onBackPressed() { exitAnimation(new Runnable() { public void run() { finish(); overridePendingTransition(0, 0); } }); } public void enterAnimation(final Runnable enterAction) { imageView.setPivotX(0); imageView.setPivotY(0); imageView.setScaleX(mWidthScale); imageView.setScaleY(mHeightScale); imageView.setTranslationX(mLeftDelta); imageView.setTranslationY(mTopDelta); TimeInterpolator sDecelerator = new DecelerateInterpolator(); imageView.animate().setDuration(DURATION).scaleX(1).scaleY(1). translationX(0).translationY(0).setInterpolator(sDecelerator).withEndAction(enterAction); ObjectAnimator bgAnim = ObjectAnimator.ofInt(colorDrawable, "alpha", 0, 255); bgAnim.setDuration(DURATION); bgAnim.start(); } public void exitAnimation(final Runnable endAction) { TimeInterpolator sInterpolator = new AccelerateInterpolator(); imageView.animate().setDuration(DURATION).scaleX(mWidthScale).scaleY(mHeightScale). translationX(mLeftDelta).translationY(mTopDelta).setInterpolator(sInterpolator).withEndAction(endAction); ObjectAnimator bgAnim = ObjectAnimator.ofInt(colorDrawable, "alpha", 0); bgAnim.setDuration(DURATION); bgAnim.start(); } }