1. 程式人生 > >商品秒殺倒計時功能+ViewPager實現畫廊效果

商品秒殺倒計時功能+ViewPager實現畫廊效果

模式一:列表形式展示資料,倒計時完成移除此條資料

效果:

這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述

涉及到的技術:RecyclerView、CardView、Fresco、CountDownTimer等,可以到本部落格去查詢

// 倒計時的實現
public class TimeDown extends CountDownTimer {

    // 傳進來的TextView
    private TextView mTextView;

    public TimeDown(TextView textView,long millisInFuture,
                    RecyclerViewBaseAdapter<Goods> adapter,Goods goods) {
        // 1秒更新
super(millisInFuture, 1000); mTextView = textView; } /** * 剩餘的倒計時數值 * @param millisUntilFinished */ @Override public void onTick(long millisUntilFinished) { mTextView.setText(" "+getData(millisUntilFinished)); } @Override public void onFinish
() { } // 利用DateFormat類 格式化毫秒數,轉變成 時:分:秒 格式 // ******注意****** 毫秒數不能大於86400000,即24小時, // 此種寫法僅適合小於24小時的格式化 private String getData(long millisUntilFinished){ // 初始化Formatter的轉換格式 SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00"
)); String hms = dateFormat.format(millisUntilFinished); return hms; } }

剩下的就是展示資料工作與倒計時完成刪除條目操作,請轉到下方原始碼下載

模式二:ViewPager畫廊模式

效果:

這裡寫圖片描述 這裡寫圖片描述 這裡寫圖片描述
1.佈局

    <!-- ViewPager要實現畫廊效果需要有個父佈局,
    而父佈局大小根據需求而定,如果想滑動任意位置都可以翻頁
    就需要設定父佈局為整個螢幕,並將整個頁面的事件分發給ViewPager
    而本案例,只需要在中間一塊的地方可以滑動即可,
    要實現多頁面展示,寬度不要match_parent,需要設定
    clipChildren屬性,讓子View超出ViewPager的範圍,即可多頁面顯示-->
    <RelativeLayout
        android:gravity="center"
        android:clipChildren="false"
        android:id="@+id/viewPagerParent"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:clipChildren="false"
            android:layout_marginTop="15dp"
            android:layout_width="270dp"
            android:layout_height="match_parent"
            android:layout_marginBottom="20dp">
        </android.support.v4.view.ViewPager>
    </RelativeLayout>

2.ViewPager設定

private void inflateView(List<View> data) {

        // 設定介面卡
        mViewPager.setAdapter(new HomeContentAdapter(data));
        // 指定載入頁數
        mViewPager.setOffscreenPageLimit(3);
        // 設定page之間的距離
        mViewPager.setPageMargin(10);

        // 設定ViewPager的切換動畫-縮放及透明度
        mViewPager.setPageTransformer(true, new ScalePageTransformer());

        // 監聽viewpager滑動
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                // 在page滑動的時候更新介面
                if (mViewPager != null) {
                    mViewPager.invalidate();
                }

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        /**
         * 需要將整個頁面的事件分發給ViewPager,否則只有中間的view能滑動,其他的地方都不能滑動,
         * 因為ViewPager佈局就是中間那一塊區域,設定了clipChildren屬性,
         * 其他的子佈局都才超出ViewPager範圍
         */
        mParent.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return mViewPager.dispatchTouchEvent(event);
            }
        });
    }

3.自定義PageTransformer 動畫效果

public class ScalePageTransformer implements ViewPager.PageTransformer {

    private static final  float  MAX_SCALE = 1.0f;
    private static final  float  MIN_SCALE = 0.8f;

    /**
     *
     * @param page  當前顯示的currentPage(View)
     * @param position  當前currentPage的偏移量
     *                  比如 a 是第一頁  b 是第二頁
     *                  當前頁為 a, 當  a  向左滑動,  直到滑到 b 時:
     *                  a 的position變化是  [-1 ,   0]   由  0  慢慢變到 -1
     *                  b 的position變化是  ( 0 ,   1]   由  1  慢慢變到  0
     */
    @Override
    public void transformPage(View page, float position) {


        if (position < -1) {
            position = -1;
        } else if (position > 1) {
            position = 1;
        }

        float tempScaleValue = position < 0 ? 1 + position : 1 - position;

        // 計算公式
        float scaleValue = MIN_SCALE + tempScaleValue * (MAX_SCALE - MIN_SCALE);

        //設定縮放比例
        page.setScaleX(scaleValue);
        page.setScaleY(scaleValue);
        //設定透明度
        page.setAlpha(scaleValue);
    }
}