1. 程式人生 > >Android點選檢視大圖過渡動畫與圖片縮放與移動

Android點選檢視大圖過渡動畫與圖片縮放與移動

從一個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();
    }
}