1. 程式人生 > >使用viewpage和動畫來打造類是電影海報畫廊展示效果

使用viewpage和動畫來打造類是電影海報畫廊展示效果

首先給大家看張效果圖:


有點類是淘寶美團等app中電影海報展示的ui畫面。這也是本篇博文最終實現效果。

這個是效果的主要類:

package com.example.galleayhenrydemo;

import android.support.v4.view.ViewPager;
import android.view.View;

/**
 * Created by leo on 16/5/7.
 */
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {

    private static final float MIN_SCALE = 0.9f;
    private static final float MIN_ALPHA = 0.5f;

    private static float defaultScale = 0.9f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);
            view.setScaleX(defaultScale);
            view.setScaleY(defaultScale);
        } else if (position <= 1) { // [-1,1]
            // Modify the default slide transition to shrink the page as well
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            float vertMargin = pageHeight * (1 - scaleFactor) / 2;
            float horzMargin = pageWidth * (1 - scaleFactor) / 2;
            if (position < 0) {
                view.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                view.setTranslationX(-horzMargin + vertMargin / 2);
            }

            // Scale the page down (between MIN_SCALE and 1)
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

            // Fade the page relative to its size.
            view.setAlpha(MIN_ALPHA +
                    (scaleFactor - MIN_SCALE) /
                            (1 - MIN_SCALE) * (1 - MIN_ALPHA));

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
            view.setScaleX(defaultScale);
            view.setScaleY(defaultScale);
        }
    }
}


這裡的main:

public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    private PageAdapter adapter;
    private LoadingDialog loaddingDialog;
    private int img[] = {R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher};

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

    private void init() {
      
        loaddingDialog = new LoadingDialog(this);
        //初始化ViewPager
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        adapter = new PageAdapter(MainActivity.this, img);
        viewPager.setOffscreenPageLimit(5);
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
        viewPager.setAdapter(adapter);
        loaddingDialog.cancel();

    }

}

其中:
viewPager.setOffscreenPageLimit(5);
這是設定viewpage預載入。為了更好提現這個屬性,給大家2張效果圖對比就知道了。

預載入設定為5的:


預載入設定為1的:


 viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
這個setpageTransformer多用於設定viewpage的滑動效果。

其中item佈局是用的一個卡片佈局方式:

 <android.support.v7.widget.CardView
        android:id="@+id/cv_card"
        android:layout_width="250dp"
        android:layout_height="match_parent"
        android:layout_margin="80dp"
        app:cardCornerRadius="3dp"
        app:cardElevation="2dp"
        app:cardPreventCornerOverlap="true"
        app:cardUseCompatPadding="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_movie"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:scaleType="fitXY"
                android:src="@mipmap/ic_loading" />

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#696969" />

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:padding="15dp"
                android:text="標題"
                android:textSize="18sp" />
        </LinearLayout>
    </android.support.v7.widget.CardView>

總共依賴了:
 compile 'com.wang.avi:library:1.0.5'
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.android.support:cardview-v7:22.2.0'
    compile 'com.android.support:recyclerview-v7:23.1.0'

其中:
compile 'com.wang.avi:library:1.0.5'
這個是網上的一個開源loadding動畫庫。大家有興趣可以去github搜尋一下。此博文可以忽視掉。

viewpage的介面卡這裡就不貼出來了。很簡單。