1. 程式人生 > >Android點選縮圖檢視大圖的縮放動畫

Android點選縮圖檢視大圖的縮放動畫

其實點選小圖顯示大圖非常簡單的一種實現方式就是,在佈局中加一個全屏的ImageView,然後隱藏。點選小圖就把圖片設定給大圖,然後大圖顯示。

這個文章裡也是這麼做的,不過這邊課程的重心在於講從縮圖到大圖的動畫過程。動畫的目的是讓過程看起來像是從小的縮圖的邊界開始放大到最終的大圖的。
這裡寫圖片描述

佈局

在佈局檔案裡設定兩張小的ImageView,和一個全屏的ImageView。還要注意根佈局。

RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp"
    tools:context="com.sunlinlin.zoomingview.MainActivity">

    <LinearLayout
android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical">
<ImageView android:id="@+id/imageView1" android:layout_width="159dp" android:layout_height="116dp" app:srcCompat
="@drawable/xiaomao" />
<ImageView android:id="@+id/imageView2" android:layout_width="159dp" android:layout_height="116dp" app:srcCompat="@mipmap/ic_launcher"/> </LinearLayout> <ImageView android:id="@+id/expanded_image"
android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00000000" android:scaleType="centerCrop" android:visibility="invisible" />
</RelativeLayout>

Activity

然後在Activit中進行一些簡單的設定,兩張小圖的點選事件是通過動畫顯示大圖。

public class MainActivity extends AppCompatActivity {

    // 持有這個動畫的引用,讓他可以在動畫執行中途取消
    private Animator mCurrentAnimator;

    private int mShortAnimationDuration;

    private View imageView1;
    private View imageView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        imageView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                zoomImageFromThumb(imageView1,R.drawable.xiaomao);
            }
        });
        imageView2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                zoomImageFromThumb(imageView2,R.mipmap.ic_launcher);
            }
        });

        // 系統預設的短動畫執行時間 200
        mShortAnimationDuration = getResources().getInteger(
                android.R.integer.config_shortAnimTime);
    }

    private void initView() {
        imageView1 = (ImageView) findViewById(R.id.imageView1);
        imageView2 = (ImageView) findViewById(R.id.imageView2);
    }
}

縮放動畫

都在註釋裡.

private void zoomImageFromThumb(final View thumbView, int imageResId) {
        // 如果有動畫正在執行,取消這個動畫
        if (mCurrentAnimator != null) {
            mCurrentAnimator.cancel();
        }

        // 載入顯示大圖的ImageView
        final ImageView expandedImageView = (ImageView) findViewById(
                R.id.expanded_image);
        expandedImageView.setImageResource(imageResId);

        // 計算初始小圖的邊界位置和最終大圖的邊界位置。
        final Rect startBounds = new Rect();
        final Rect finalBounds = new Rect();
        final Point globalOffset = new Point();

        // 小圖的邊界就是小ImageView的邊界,大圖的邊界因為是鋪滿全屏的,所以就是整個佈局的邊界。
        // 然後根據偏移量得到正確的座標。
        thumbView.getGlobalVisibleRect(startBounds);
        findViewById(R.id.container).getGlobalVisibleRect(finalBounds, globalOffset);
        startBounds.offset(-globalOffset.x, -globalOffset.y);
        finalBounds.offset(-globalOffset.x, -globalOffset.y);

        // 計算初始的縮放比例。最終的縮放比例為1。並調整縮放方向,使看著協調。
        float startScale=0;
        if ((float) finalBounds.width() / finalBounds.height()
                > (float) startBounds.width() / startBounds.height()) {
            // 橫向縮放
            float startWidth = startScale * finalBounds.width();
            float deltaWidth = (startWidth - startBounds.width()) / 2;
            startBounds.left -= deltaWidth;
            startBounds.right += deltaWidth;
        } else {
            // 豎向縮放
            float startHeight = startScale * finalBounds.height();
            float deltaHeight = (startHeight - startBounds.height()) / 2;
            startBounds.top -= deltaHeight;
            startBounds.bottom += deltaHeight;
        }

        // 隱藏小圖,並顯示大圖
        thumbView.setAlpha(0f);
        expandedImageView.setVisibility(View.VISIBLE);

        // 將大圖的縮放中心點移到左上角。預設是從中心縮放
        expandedImageView.setPivotX(0f);
        expandedImageView.setPivotY(0f);

        //對大圖進行縮放動畫
        AnimatorSet set = new AnimatorSet();
        set.play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left, finalBounds.left))
            .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top, finalBounds.top))
            .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScale, 1f))
            .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScale, 1f));
        set.setDuration(mShortAnimationDuration);
        set.setInterpolator(new DecelerateInterpolator());
        set.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                mCurrentAnimator = null;
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                mCurrentAnimator = null;
            }
        });
        set.start();
        mCurrentAnimator = set;

        // 點選大圖時,反向縮放大圖,然後隱藏大圖,顯示小圖。
        final float startScaleFinal = startScale;
        expandedImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mCurrentAnimator != null) {
                    mCurrentAnimator.cancel();
                }

                AnimatorSet set = new AnimatorSet();
                set.play(ObjectAnimator
                        .ofFloat(expandedImageView, View.X, startBounds.left))
                        .with(ObjectAnimator
                                .ofFloat(expandedImageView,
                                        View.Y,startBounds.top))
                        .with(ObjectAnimator
                                .ofFloat(expandedImageView,
                                        View.SCALE_X, startScaleFinal))
                        .with(ObjectAnimator
                                .ofFloat(expandedImageView,
                                        View.SCALE_Y, startScaleFinal));
                set.setDuration(mShortAnimationDuration);
                set.setInterpolator(new DecelerateInterpolator());
                set.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        thumbView.setAlpha(1f);
                        expandedImageView.setVisibility(View.GONE);
                        mCurrentAnimator = null;
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
                        thumbView.setAlpha(1f);
                        expandedImageView.setVisibility(View.GONE);
                        mCurrentAnimator = null;
                    }
                });
                set.start();
                mCurrentAnimator = set;
            }
        });
    }

相關推薦

Android檢視動畫

其實點選小圖顯示大圖非常簡單的一種實現方式就是,在佈局中加一個全屏的ImageView,然後隱藏。點選小圖就把圖片設定給大圖,然後大圖顯示。 這個文章裡也是這麼做的,不過這邊課程的重心在於講從縮圖到大圖的動畫過程。動畫的目的是讓過程看起來像是從小的縮圖

android 檢視

android中點選縮圖檢視大圖的方法一般有兩種,一種是想新浪微博list頁面那樣,彈出一個視窗顯示大圖(原activity為背景)。另一種就是直接開啟一個新的activity顯示大圖。 1、第一種方法我們可以使用自定義的Dialog來實現: /** * 點選縮圖開啟

android檢視

android中點選縮圖檢視大圖的方法一般有兩種,一種是想新浪微博list頁面那樣,彈出一個視窗顯示大圖(原activity為背景)。另一種就是直接開啟一個新的activity顯示大圖。 1、第一種方法我們可以使用自定

html檢視

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-

圖片 彈出

<div class="box-body table-responsive no-padding"> <table class="table table-hover">

bootstrap 圖片彈出

效果: 在一個table裡顯示很多的小圖,每點選一個圖片,顯示一張大圖。 小圖的html <td><img height='120px' width='200px' src="

Android開發之--檢視

android中點選縮圖檢視大圖的方法一般有兩種,一種是想新浪微博list頁面那樣,彈出一個視窗顯示大圖(原activity為背景)。另一種就是直接開啟一個新的activity顯示大圖。1、第一種方法我們可以使用自定義的AlertDialog來實現,程式碼如下: ImageView image=(Imag

Android檢視過渡動畫與圖片與移動

從一個activity到另一個activity的過渡 1.小圖點選事件程式碼 @Override public void onClick(View view) { switch (view.getId()) { case R.id.img_1:

Android WebView 圖片超出寬度自適應,檢視

webView 配置  WebSettings webSettings = webView.getSettings(); webSettings.setJava

微信JSSDK上傳預覽多,ios/Android檢視,支援滑動。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev

Android 實現WebView圖片檢視列表及圖片儲存

在日常開發過程中,有時候會遇到需要在app中嵌入網頁,此時使用WebView實現效果,但在預設情況下是無法點選圖片檢視大圖的,更無法儲存圖片。本文將就這一系列問題的實現進行說明。 圖示: 專案的知識點: 載入網頁後如何捕捉網頁中的圖片點選事件; 獲取點選

android webview載入html圖片自適應手機螢幕大小&檢視

我們在開發中,顯示資訊詳情時,一般後臺會給出html文字,在Android端一般採用webview控制元件來展示,但是後臺給出的html文字一般是給電腦端用的,沒有自適配手機,導致手機端圖片顯示過大,需要左右移動來檢視全圖。下面給出幾種實用方法,達到在手機端用webvi

js 移動端漂亮input框上傳本地,顯示可以檢視

//首先根據id得到input框的檔案,判斷大小,如果大於100M就不給上傳,如果不大於就可以上傳 $("input[type='file']").on("change",function(){ var load =$(this).attr("id"); var fileSize

jquery特效---jquery顯示檢視,並且可自適應原大小

          之前為了實現這樣的效果找了很久,大部分都不是自己想要的。           實現這樣的效果,我用了兩個jquery的框架。一個是 jquery.nailthumb.1.1.js,另一個是jquery.colorbox-min.js。          

Android ImageView 檢視

彈出dialog 即可: private void seeBigImg() {// TODO Auto-generated method stubimageView.setOnClickListener(new OnClickListener() { // 點選放大publ

Android,放大至全

最近做一個專案類似於QQ空間,做到照片瀏覽的功能,對於QQ空間中點選圖片放大至全屏,感覺效果很贊,於是也做了個類似的效果。如下。 我不知道QQ那個是怎麼做的,我的思路如下: 首先,從圖片縮略介面跳轉到圖片詳情頁面,應該是從一個Activity跳轉到另外一個Activ

檢視滑動預覽(h5,pc通用)

點選預覽大圖並滑動觀看,支援手機端和pc端,具體功能如下圖:     一. touchTouch 的js和css 以及jquery依賴庫 <link rel="stylesheet" type="text/css" href="touchTouch/touchTouch

ionic2 檢視 再次關閉

import { Injectable } from '@angular/core'; import { Component } from '@angular/core'; import { App, ViewController, NavOptions, NavParams, Action

PC端——檢視

1、html佈局: <a href="{{ d.img_url }}" data-lightbox="roadtrip" data-field="img_url" class="lightbox_style doctor_image"> <

mui- 給圖片新增檢視功能

<html> <head> <meta charset="utf-8"> <title>圖片放大</title> <meta name="viewport" content="width=device-width,