商品秒殺倒計時功能+ViewPager實現畫廊效果
阿新 • • 發佈:2019-01-26
模式一:列表形式展示資料,倒計時完成移除此條資料
效果:
涉及到的技術: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);
}
}