Android仿淘寶頭條向上滾動(dòng)廣告條ViewFlipper
所謂前人栽樹,后人乘涼,在此感謝博主的貢獻(xiàn)。
參考博文:
我在博主的基礎(chǔ)上做了如下工作:
- 修復(fù)了滾動(dòng)條第二條點(diǎn)擊事件無法觸發(fā)這個(gè)bug;
- 充分簡化了自定義ViewFlipper類的代碼;
- 添加了直接使用ViewFlipper控件實(shí)現(xiàn)同樣效果;
先上效果圖:
這里使用了一個(gè)比較少用的控件:ViewFlipper
學(xué)習(xí)一個(gè)未知的東西,第一步就是要搞懂what:學(xué)的這個(gè)東西是什么以及能夠?qū)崿F(xiàn)什么效果!第二步就是要搞懂How:這個(gè)東西如何使用。
What:
該控件的官方介紹:
Simple ViewAnimator that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.
鄙人的翻譯:
簡單ViewAnimator實(shí)現(xiàn)器將已添加到其兩個(gè)或多個(gè)視圖之間實(shí)現(xiàn)動(dòng)畫效果。 一次只顯示一個(gè)孩子(子視圖)。
如果需要,可以在每個(gè)孩子(子視圖)之間定期自動(dòng)翻轉(zhuǎn)。
How:
實(shí)現(xiàn)方式:
1.繼承ViewFlipper類通過代碼設(shè)置動(dòng)畫間隔時(shí)間以及動(dòng)畫效果
1.1自定義ViewFlipper
/** * Created by Veyron on 2017/2/20. * Function:自定義ViewFlipper控件 */ public class UpView extends ViewFlipper { private Context mContext; private boolean isSetAnimDuration = false; private int interval = 2000; /** * 動(dòng)畫時(shí)間 */ private int animDuration = 500; public UpView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } private void init(Context context, AttributeSet attrs, int defStyleAttr) { this.mContext = context; setFlipInterval(interval);//設(shè)置時(shí)間間隔2000毫秒 //進(jìn)來的動(dòng)畫 Animation animIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_in); if (isSetAnimDuration) animIn.setDuration(animDuration); setInAnimation(animIn); //退出的動(dòng)畫 Animation animOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_out); if (isSetAnimDuration) animOut.setDuration(animDuration); setOutAnimation(animOut); } /** * 設(shè)置循環(huán)滾動(dòng)的View數(shù)組 * * @param views */ public void setViews(final List<View> views) { if (views == null || views.size() == 0) return; removeAllViews(); for ( int i = 0; i < views.size(); i++) { final int position=i; //設(shè)置翻滾的子view addView(views.get(i)); } startFlipping(); //開啟翻滾 } }
1.2布局文件中引入
<com.veyron.www.viewflipperdemo.View.UpView android:id="@+id/upview1" android:layout_marginLeft="20dp" android:layout_width="match_parent" android:layout_toRightOf="@+id/tbtv" android:layout_centerVertical="true" android:layout_marginTop="10dp" android:layout_height="match_parent"> </com.veyron.www.viewflipperdemo.View.UpView>
2.除了方式一,還可以在布局文件中通過設(shè)定ViewFlipper的屬性來達(dá)到同樣的效果。
<ViewFlipper android:id="@+id/upview2" android:autoStart="true" android:background="#fff" android:inAnimation="@anim/anim_in" android:outAnimation="@anim/anim_out" android:flipInterval="3000"> </ViewFlipper>
具體實(shí)現(xiàn)上面兩種方式
MainActivity.java
/** * Created by Veyron on 2017/2/20. * Function:主界面,加載布局 */ public class MainActivity extends AppCompatActivity { private UpView upview1; //自定義的ViewFlipper private ViewFlipper mViewFlipper; //直接使用該控件 List<String> data = new ArrayList<>(); //文字?jǐn)?shù)據(jù)集合 List<View> views = new ArrayList<>(); //滾動(dòng)的view集合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initdata(); initView(); } private void initView() { //自定義的 upview1 = (UpView) findViewById(R.id.upview1); setView(); upview1.setViews(views);//給自定義的ViewFlipper設(shè)置滾動(dòng)的view //非自定義的,直接使用控件的 mViewFlipper = (ViewFlipper) findViewById(R.id.upview2); //添加翻滾的子view mViewFlipper.addView(View.inflate(this, R.layout.view1, null)); mViewFlipper.addView(View.inflate(this, R.layout.view2, null)); } /** * 初始化需要循環(huán)的View * 為了靈活的使用滾動(dòng)的View,所以把滾動(dòng)的內(nèi)容讓用戶自定義 * 假如滾動(dòng)的是三條或者一條,或者是其他,只需要把對(duì)應(yīng)的布局,和這個(gè)方法稍微改改就可以了, */ private void setView() { for (int i = 0; i < data.size(); i = i + 2) { final int position = i; //設(shè)置滾動(dòng)的單個(gè)布局 LinearLayout moreView = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.item_view, null); //初始化布局里面的控件,只要設(shè)置這兩個(gè)控件的監(jiān)聽就達(dá)到目的 TextView tv1 = (TextView) moreView.findViewById(R.id.tv1); TextView tv2 = (TextView) moreView.findViewById(R.id.tv2); /** * 設(shè)置監(jiān)聽 */ moreView.findViewById(R.id.rl).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this, data.get(position).toString(), Toast.LENGTH_SHORT).show(); Log.d("TAG",data.get(position).toString()); /** * 添加業(yè)務(wù)代碼 */ } }); /** * 設(shè)置監(jiān)聽 */ moreView.findViewById(R.id.rl2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this, data.get(position+1).toString(), Toast.LENGTH_SHORT).show(); Log.d("TAG",data.get(position+1).toString()); /** * 添加業(yè)務(wù)代碼 */ } }); //進(jìn)行對(duì)控件賦值 tv1.setText(data.get(i).toString()); if (data.size() > i + 1) { //因?yàn)樘詫毮莾菏莾蓷l數(shù)據(jù),但是當(dāng)數(shù)據(jù)是奇數(shù)時(shí)就不需要賦值第二個(gè),所以加了一個(gè)判斷,還應(yīng)該把第二個(gè)布局給隱藏掉 tv2.setText(data.get(i + 1).toString()); } else { moreView.findViewById(R.id.rl2).setVisibility(View.GONE); } //添加到循環(huán)滾動(dòng)數(shù)組里面去 views.add(moreView); //也就是滾動(dòng)的view集合 } } /** * 初始化數(shù)據(jù) */ private void initdata() { data = new ArrayList<>(); data.add("美劇《行尸走肉》上線Steam 每一集售價(jià)2.99..."); data.add("2017四月新番動(dòng)畫全預(yù)覽!你期待那部"); data.add("生娃后,老公有過這些舉動(dòng),你卻沒加錯(cuò)人!"); data.add("汽車開空調(diào)耗油?只因?yàn)榘村e(cuò)了一個(gè)鍵"); data.add("心疼S7 edge 三星官方‘虐機(jī)'視頻上線"); } }
API介紹
常用屬性:
- autoStart:ture,則自動(dòng)開始滾動(dòng)
- inAnimation:滾動(dòng)進(jìn)入的動(dòng)畫
- outAnimation:滾動(dòng)出去的動(dòng)畫
- flipInterval:時(shí)間間隔
常用方法:
- startFlipping():開始翻滾
- setOutAnimation():滾動(dòng)出去的動(dòng)畫
- setInAnimation():滾動(dòng)進(jìn)入的動(dòng)畫
- setFlipInterval():設(shè)置時(shí)間間隔-毫秒
- ViewFlipper對(duì)象的addView():加載需要滾動(dòng)的視圖對(duì)象
ViewFlipper具體屬性詳見:ViewFlipper控件的官方api
源碼:
如果該你喜歡該項(xiàng)目,歡迎fork,歡迎點(diǎn)個(gè)Star!!
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用ViewPager實(shí)現(xiàn)滾動(dòng)廣告
- Android 知乎廣告效果實(shí)現(xiàn)代碼
- Android 實(shí)現(xiàn)廣告歡迎界面(倒計(jì)時(shí))
- Android開發(fā)實(shí)現(xiàn)廣告無限循環(huán)功能示例
- Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例
- Android ViewPager實(shí)現(xiàn)無限循環(huán)輪播廣告位Banner效果
- Android 應(yīng)用啟動(dòng)歡迎界面廣告的實(shí)現(xiàn)實(shí)例
- Kotlin FrameLayout與ViewPager2控件實(shí)現(xiàn)滾動(dòng)廣告欄方法
相關(guān)文章
Android實(shí)現(xiàn)Banner界面廣告圖片循環(huán)輪播(包括實(shí)現(xiàn)手動(dòng)滑動(dòng)循環(huán))
這篇文章主要介紹了Android實(shí)現(xiàn)Banner界面廣告圖片循環(huán)輪播(包括實(shí)現(xiàn)手動(dòng)滑動(dòng)循環(huán))的相關(guān)資料,需要的朋友可以參考下2016-02-02淺談Android onTouchEvent 與 onInterceptTouchEvent的區(qū)別詳解
本篇文章小編為大家介紹,Android onTouchEvent 與 onInterceptTouchEvent的區(qū)別詳解。需要的朋友參考下2013-04-04Android應(yīng)用開發(fā)SharedPreferences存儲(chǔ)數(shù)據(jù)的使用方法
SharedPreferences是Android中最容易理解的數(shù)據(jù)存儲(chǔ)技術(shù),實(shí)際上SharedPreferences處理的就是一個(gè)key-value(鍵值對(duì))SharedPreferences常用來存儲(chǔ)一些輕量級(jí)的數(shù)據(jù)2012-11-11Android?ASM插樁探索實(shí)戰(zhàn)詳情
這篇文章主要介紹了Android?ASM插樁探索實(shí)戰(zhàn)詳情,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Android用代碼獲取手機(jī)root之后的最高權(quán)限
機(jī)得root之后通過代碼可以獲得最高權(quán)限如果沒有root的話請(qǐng)不要往下看,毫無意義,root之后的朋友可以參考下本文或許有意想不到的收獲2013-03-03mac系統(tǒng)下載、安裝、使用AndroidStudio
本文給大家介紹的是在Mac系統(tǒng)中下載安裝以及使用AndroidStudio的詳細(xì)教程,非常的實(shí)用,有需要的小伙伴可以參考下2017-10-10Android實(shí)現(xiàn)下載zip壓縮文件并解壓的方法(附源碼)
這篇文章主要給大家介紹了利用Android實(shí)現(xiàn)下載zip壓縮文件并解壓的方法,文中給出了示例代碼并提供了源碼下載,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02Android onLoadFinished與onLoaderReset回調(diào)詳解及實(shí)例
這篇文章主要介紹了Android onLoadFinished與onLoaderReset回調(diào)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03