使用viewpage和動畫來打造類是電影海報畫廊展示效果
阿新 • • 發佈:2019-01-02
首先給大家看張效果圖:
有點類是淘寶美團等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的介面卡這裡就不貼出來了。很簡單。