Android UI設(shè)計(jì)與開發(fā)之ViewPager仿微信引導(dǎo)界面以及動(dòng)畫效果
基于前兩篇比較簡(jiǎn)單的實(shí)例做鋪墊之后,這一篇我們來實(shí)現(xiàn)一個(gè)稍微復(fù)雜一點(diǎn)的引導(dǎo)界面的效果,當(dāng)然也只是稍微復(fù)雜了一點(diǎn),對(duì)于會(huì)的人來說當(dāng)然還是so easy!正所謂會(huì)者不難,難者不會(huì),大概說的就是這個(gè)意思了吧。好的,話不多說,回歸正題。
這篇要實(shí)現(xiàn)的是一個(gè)仿微信的動(dòng)畫效果,雖然這種效果的實(shí)現(xiàn)在網(wǎng)上到處都有,但是我還是想站在中低端開發(fā)者的角度去告訴大家是如何實(shí)現(xiàn)的,當(dāng)然實(shí)現(xiàn)的方式有很多,我也只是列出了我認(rèn)為實(shí)現(xiàn)起來比較方便的一種方法,希望大家能夠受用。
一、實(shí)現(xiàn)的效果圖
有圖才有真相,上圖先:
點(diǎn)擊按鈕后出現(xiàn)動(dòng)畫效果,然后進(jìn)入到另一個(gè)界面:
二 、程序的目錄結(jié)構(gòu)
三、具體的編碼實(shí)現(xiàn)
1、 在主布局界面中加入ViewPager組件,以及底部的小點(diǎn),activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <LinearLayout android:id="@+id/ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="24.0dip" android:orientation="horizontal" > <ImageView android:id="@+id/page0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="5dip" android:src="@drawable/page_indicator_focused" /> <ImageView android:id="@+id/page1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="5dip" android:src="@drawable/page_indicator_unfocused" /> <ImageView android:id="@+id/page2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="5dip" android:src="@drawable/page_indicator_unfocused" /> <ImageView android:id="@+id/page3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="5dip" android:src="@drawable/page_indicator_unfocused" /> <ImageView android:id="@+id/page4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="5dip" android:src="@drawable/page_indicator_unfocused" /> <ImageView android:id="@+id/page5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="5dip" android:src="@drawable/page_indicator_unfocused" /> </LinearLayout> </RelativeLayout>
2、接著在guide_view01.xml等幾個(gè)布局頁面中添加引導(dǎo)界面要顯示的圖片和控件,因?yàn)檫@幾個(gè)布局界面都大同小異,所以在這里我就不一一貼出來了吧,有需要的同學(xué)可以直接下載源碼,guide_view01.xml:
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/w01" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="35dp" android:gravity="center" android:text="@string/guide_text01" android:textColor="@color/TextColor" android:textSize="22sp" /> </RelativeLayout>
3、然后是要實(shí)現(xiàn)動(dòng)畫效果的布局界面,guide_door.xml:
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/imageLeft" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:scaleType="fitXY" android:src="@drawable/w_left" /> <ImageView android:id="@+id/imageRight" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:scaleType="fitXY" android:src="@drawable/w_right" android:visibility="visible" /> <TextView android:id="@+id/anim_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="35dp" android:gravity="center" android:text=" \n \n微信,是一個(gè)生活方式\n \n " android:textColor="#fff" android:textSize="22sp" /> </RelativeLayout>
4、最后是完成動(dòng)畫效果之后進(jìn)入的布局界面,activity_other.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="親,可以開始你的微信生活了!" /> </LinearLayout>
5、在這里還要?jiǎng)?chuàng)建一個(gè)xml文件來實(shí)現(xiàn)自定義按鈕的效果,關(guān)于自定義按鈕的效果實(shí)現(xiàn)我會(huì)在后面的文章中專題詳細(xì)介紹,這里就不在贅述,start_weixin_btn.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/whatsnew_btn_pressed" /> <!--按下時(shí)的效果--> <item android:state_enabled="true" android:drawable="@drawable/whatsnew_btn_nor" /> <!--正常狀態(tài)的效果--> </selector>
6、布局界面已經(jīng)講解完畢,接下來讓我們進(jìn)行詳細(xì)的代碼講解,ViewPager適配器代碼,ViewPagerAdapter.java:
package com.yangyu.myguideview02; import java.util.ArrayList; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; /** * @author yangyu * 功能描述:ViewPager適配器,用來綁定數(shù)據(jù)和view */ public class ViewPagerAdapter extends PagerAdapter { //界面列表 private ArrayList<View> views; public ViewPagerAdapter (ArrayList<View> views){ this.views = views; } /** * 獲得當(dāng)前界面數(shù) */ @Override public int getCount() { if (views != null) { return views.size(); } return 0; } /** * 初始化position位置的界面 */ @Override public Object instantiateItem(View view, int position) { ((ViewPager) view).addView(views.get(position), 0); return views.get(position); } /** * 判斷是否由對(duì)象生成界面 */ @Override public boolean isViewFromObject(View view, Object arg1) { return (view == arg1); } /** * 銷毀position位置的界面 */ @Override public void destroyItem(View view, int position, Object arg2) { ((ViewPager) view).removeView(views.get(position)); } }
7、主程序入口activity類,MainActivity.java:
package com.yangyu.myguideview02; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; /** * @author yangyu * 功能描述:主程序入口activity */ public class MainActivity extends Activity { // 定義ViewPager對(duì)象 private ViewPager viewPager; // 定義ViewPager適配器 private ViewPagerAdapter vpAdapter; // 定義一個(gè)ArrayList來存放View private ArrayList<View> views; //定義各個(gè)界面View對(duì)象 private View view1,view2,view3,view4,view5,view6; // 定義底部小點(diǎn)圖片 private ImageView pointImage0, pointImage1, pointImage2, pointImage3,pointImage4, pointImage5; //定義開始按鈕對(duì)象 private Button startBt; // 當(dāng)前的位置索引值 private int currIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } /** * 初始化組件 */ private void initView() { //實(shí)例化各個(gè)界面的布局對(duì)象 LayoutInflater mLi = LayoutInflater.from(this); view1 = mLi.inflate(R.layout.guide_view01, null); view2 = mLi.inflate(R.layout.guide_view02, null); view3 = mLi.inflate(R.layout.guide_view03, null); view4 = mLi.inflate(R.layout.guide_view04, null); view5 = mLi.inflate(R.layout.guide_view05, null); view6 = mLi.inflate(R.layout.guide_view06, null); // 實(shí)例化ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); // 實(shí)例化ArrayList對(duì)象 views = new ArrayList<View>(); // 實(shí)例化ViewPager適配器 vpAdapter = new ViewPagerAdapter(views); // 實(shí)例化底部小點(diǎn)圖片對(duì)象 pointImage0 = (ImageView) findViewById(R.id.page0); pointImage1 = (ImageView) findViewById(R.id.page1); pointImage2 = (ImageView) findViewById(R.id.page2); pointImage3 = (ImageView) findViewById(R.id.page3); pointImage4 = (ImageView) findViewById(R.id.page4); pointImage5 = (ImageView) findViewById(R.id.page5); //實(shí)例化開始按鈕 startBt = (Button) view6.findViewById(R.id.startBtn); } /** * 初始化數(shù)據(jù) */ private void initData() { // 設(shè)置監(jiān)聽 viewPager.setOnPageChangeListener(new MyOnPageChangeListener()); // 設(shè)置適配器數(shù)據(jù) viewPager.setAdapter(vpAdapter); //將要分頁顯示的View裝入數(shù)組中 views.add(view1); views.add(view2); views.add(view3); views.add(view4); views.add(view5); views.add(view6); // 給開始按鈕設(shè)置監(jiān)聽 startBt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startbutton(); } }); } public class MyOnPageChangeListener implements OnPageChangeListener { @Override public void onPageSelected(int position) { switch (position) { case 0: pointImage0.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused)); pointImage1.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); break; case 1: pointImage1.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused)); pointImage0.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); pointImage2.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); break; case 2: pointImage2.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused)); pointImage1.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); pointImage3.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); break; case 3: pointImage3.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused)); pointImage4.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); pointImage2.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); break; case 4: pointImage4.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused)); pointImage3.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); pointImage5.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); break; case 5: pointImage5.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_focused)); pointImage4.setImageDrawable(getResources().getDrawable(R.drawable.page_indicator_unfocused)); break; } currIndex = position; // animation.setFillAfter(true);// True:圖片停在動(dòng)畫結(jié)束位置 // animation.setDuration(300); // mPageImg.startAnimation(animation); } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } } /** * 相應(yīng)按鈕點(diǎn)擊事件 */ private void startbutton() { Intent intent = new Intent(); intent.setClass(MainActivity.this,GuideViewDoor.class); startActivity(intent); this.finish(); } }
PS:在這段代碼中,有個(gè)地方需要注意,盡管我們寫代碼的時(shí)候一直很小心,但還是避免不了會(huì)犯一些低級(jí)的錯(cuò)誤,以至于調(diào)試耽誤了時(shí)間
//實(shí)例化開始按鈕 startBt = (Button) view6.findViewById(R.id.startBtn);
這是最后一個(gè)布局界面中的一個(gè)開始按鈕,由于在findvViewById()方法前面忘記使用了view6來調(diào)用該方法,以至于模擬器報(bào)出空指針異常。
8、實(shí)現(xiàn)動(dòng)畫效果的入口activity類,在這個(gè)類中主要實(shí)現(xiàn)了點(diǎn)擊開始按鈕后實(shí)現(xiàn)一個(gè)動(dòng)畫效果來達(dá)到進(jìn)入另一個(gè)界面的目的,該類中的主要使用了動(dòng)畫類。我會(huì)在后面的章節(jié)中以專題的形式來介紹動(dòng)畫這一塊的類容,所以這里也不再贅述,
GuideViewDoor.Java:
package com.yangyu.myguideview02; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.TextView; /** * @author yangyu * 功能描述:實(shí)現(xiàn)動(dòng)畫效果的入口activity */ public class GuideViewDoor extends Activity { //定義左右兩張圖片對(duì)象 private ImageView mLeft,mRight; //定義一個(gè)文本對(duì)象 private TextView mText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.guide_door); //實(shí)例化對(duì)象 mLeft = (ImageView)findViewById(R.id.imageLeft); mRight = (ImageView)findViewById(R.id.imageRight); mText = (TextView)findViewById(R.id.anim_text); //實(shí)例化動(dòng)畫對(duì)象 AnimationSet anim = new AnimationSet(true); //實(shí)例化位移動(dòng)畫對(duì)象 TranslateAnimation mytranslateanim = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-1f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f); //設(shè)置動(dòng)畫持續(xù)時(shí)間 mytranslateanim.setDuration(2000); //設(shè)置啟動(dòng)時(shí)間 anim.setStartOffset(800); //將位移動(dòng)畫添加進(jìn)動(dòng)畫效果中 anim.addAnimation(mytranslateanim); //動(dòng)畫結(jié)束后,保留在終止位 anim.setFillAfter(true); //左邊圖啟動(dòng)該動(dòng)畫效果 mLeft.startAnimation(anim); AnimationSet anim1 = new AnimationSet(true); TranslateAnimation mytranslateanim1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,+1f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f); mytranslateanim1.setDuration(1500); anim1.addAnimation(mytranslateanim1); anim1.setStartOffset(800); anim1.setFillAfter(true); mRight.startAnimation(anim1); AnimationSet anim2 = new AnimationSet(true); ScaleAnimation myscaleanim = new ScaleAnimation(1f,3f,1f,3f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); myscaleanim.setDuration(1000); AlphaAnimation myalphaanim = new AlphaAnimation(1,0.0001f); myalphaanim.setDuration(1500); anim2.addAnimation(myscaleanim); anim2.addAnimation(myalphaanim); anim2.setFillAfter(true); mText.startAnimation(anim2); new Handler().postDelayed(new Runnable(){ @Override public void run(){ Intent intent = new Intent (GuideViewDoor.this,OtherActivity.class); startActivity(intent); GuideViewDoor.this.finish(); } }, 2300); } }
9、最后是另一個(gè)activity類,我為了只是達(dá)到進(jìn)入到另一個(gè)界面的這種效果,所以代碼比較簡(jiǎn)單,就是調(diào)用了一個(gè)layout布局頁面,OtherActivity.java:
package com.yangyu.myguideview02; import android.app.Activity; import android.os.Bundle; /** * @author yangyu * 功能描述:另一個(gè)activity */ public class OtherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_other); } }
10、最后大家別忘了在AndroidManifest.xml清單文件中為程序添加GuideViewDoor、OtherActivity這兩個(gè)activity,否則會(huì)報(bào)出異常。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用ViewPager實(shí)現(xiàn)啟動(dòng)引導(dǎo)頁
- Android開發(fā)實(shí)戰(zhàn)之漂亮的ViewPager引導(dǎo)頁
- Android控件ViewPager實(shí)現(xiàn)帶有動(dòng)畫的引導(dǎo)頁
- Android開發(fā)實(shí)現(xiàn)的ViewPager引導(dǎo)頁功能(動(dòng)態(tài)加載指示器)詳解
- Android利用ViewPager實(shí)現(xiàn)用戶引導(dǎo)界面效果的方法
- Android UI設(shè)計(jì)與開發(fā)之使用ViewPager實(shí)現(xiàn)歡迎引導(dǎo)頁面
- Android UI設(shè)計(jì)與開發(fā)之ViewPager介紹和簡(jiǎn)單實(shí)現(xiàn)引導(dǎo)界面
- android使用ViewPager組件實(shí)現(xiàn)app引導(dǎo)查看頁面
- Android自定義引導(dǎo)玩轉(zhuǎn)ViewPager的方法詳解
相關(guān)文章
開箱即用的Google與百度定位坐標(biāo)系轉(zhuǎn)換實(shí)例
這篇文章主要為大家介紹了開箱即用的Google與百度定位坐標(biāo)系轉(zhuǎn)換實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼
這篇文章主要介紹了Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法
本篇文章主要介紹了Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android學(xué)習(xí)筆記(二)App工程文件分析
之前寫過一篇關(guān)于安卓環(huán)境配置以及第一個(gè)app的制作過程,下面我們來進(jìn)一步,分析下APP工程文件2014-07-07Android自定義PopupWindow簡(jiǎn)單小例子
這篇文章主要為大家詳細(xì)介紹了Android自定義PopupWindow簡(jiǎn)單小例子,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android開發(fā)Kotlin語言協(xié)程的依賴及使用示例
這篇文章主要為大家介紹了Android開發(fā)Kotlin語言協(xié)程的依賴及使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Android中的webview監(jiān)聽每次URL變化實(shí)例
這篇文章主要介紹了Android中的webview監(jiān)聽每次URL變化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03