Android UI設(shè)計(jì)與開(kāi)發(fā)之ViewPager仿微信引導(dǎo)界面以及動(dòng)畫(huà)效果
基于前兩篇比較簡(jiǎn)單的實(shí)例做鋪墊之后,這一篇我們來(lái)實(shí)現(xiàn)一個(gè)稍微復(fù)雜一點(diǎn)的引導(dǎo)界面的效果,當(dāng)然也只是稍微復(fù)雜了一點(diǎn),對(duì)于會(huì)的人來(lái)說(shuō)當(dāng)然還是so easy!正所謂會(huì)者不難,難者不會(huì),大概說(shuō)的就是這個(gè)意思了吧。好的,話不多說(shuō),回歸正題。
這篇要實(shí)現(xiàn)的是一個(gè)仿微信的動(dòng)畫(huà)效果,雖然這種效果的實(shí)現(xiàn)在網(wǎng)上到處都有,但是我還是想站在中低端開(kāi)發(fā)者的角度去告訴大家是如何實(shí)現(xiàn)的,當(dāng)然實(shí)現(xiàn)的方式有很多,我也只是列出了我認(rèn)為實(shí)現(xiàn)起來(lái)比較方便的一種方法,希望大家能夠受用。
一、實(shí)現(xiàn)的效果圖
有圖才有真相,上圖先:


點(diǎn)擊按鈕后出現(xiàn)動(dòng)畫(huà)效果,然后進(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è)布局頁(yè)面中添加引導(dǎo)界面要顯示的圖片和控件,因?yàn)檫@幾個(gè)布局界面都大同小異,所以在這里我就不一一貼出來(lái)了吧,有需要的同學(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)畫(huà)效果的布局界面,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)畫(huà)效果之后進(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="親,可以開(kāi)始你的微信生活了!" /> </LinearLayout>
5、在這里還要?jiǎng)?chuàng)建一個(gè)xml文件來(lái)實(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)講解完畢,接下來(lái)讓我們進(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適配器,用來(lái)綁定數(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);
}
/**
* 銷(xiāo)毀position位置的界面
*/
@Override
public void destroyItem(View view, int position, Object arg2) {
((ViewPager) view).removeView(views.get(position));
}
}
7、主程序入口activity類(lèi),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來(lái)存放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;
//定義開(kāi)始按鈕對(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í)例化開(kāi)始按鈕
startBt = (Button) view6.findViewById(R.id.startBtn);
}
/**
* 初始化數(shù)據(jù)
*/
private void initData() {
// 設(shè)置監(jiān)聽(tīng)
viewPager.setOnPageChangeListener(new MyOnPageChangeListener());
// 設(shè)置適配器數(shù)據(jù)
viewPager.setAdapter(vpAdapter);
//將要分頁(yè)顯示的View裝入數(shù)組中
views.add(view1);
views.add(view2);
views.add(view3);
views.add(view4);
views.add(view5);
views.add(view6);
// 給開(kāi)始按鈕設(shè)置監(jiān)聽(tīng)
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)畫(huà)結(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è)地方需要注意,盡管我們寫(xiě)代碼的時(shí)候一直很小心,但還是避免不了會(huì)犯一些低級(jí)的錯(cuò)誤,以至于調(diào)試耽誤了時(shí)間
//實(shí)例化開(kāi)始按鈕 startBt = (Button) view6.findViewById(R.id.startBtn);
這是最后一個(gè)布局界面中的一個(gè)開(kāi)始按鈕,由于在findvViewById()方法前面忘記使用了view6來(lái)調(diào)用該方法,以至于模擬器報(bào)出空指針異常。
8、實(shí)現(xiàn)動(dòng)畫(huà)效果的入口activity類(lèi),在這個(gè)類(lèi)中主要實(shí)現(xiàn)了點(diǎn)擊開(kāi)始按鈕后實(shí)現(xiàn)一個(gè)動(dòng)畫(huà)效果來(lái)達(dá)到進(jìn)入另一個(gè)界面的目的,該類(lèi)中的主要使用了動(dòng)畫(huà)類(lèi)。我會(huì)在后面的章節(jié)中以專題的形式來(lái)介紹動(dòng)畫(huà)這一塊的類(lèi)容,所以這里也不再贅述,
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)畫(huà)效果的入口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)畫(huà)對(duì)象
AnimationSet anim = new AnimationSet(true);
//實(shí)例化位移動(dòng)畫(huà)對(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)畫(huà)持續(xù)時(shí)間
mytranslateanim.setDuration(2000);
//設(shè)置啟動(dòng)時(shí)間
anim.setStartOffset(800);
//將位移動(dòng)畫(huà)添加進(jìn)動(dòng)畫(huà)效果中
anim.addAnimation(mytranslateanim);
//動(dòng)畫(huà)結(jié)束后,保留在終止位
anim.setFillAfter(true);
//左邊圖啟動(dòng)該動(dòng)畫(huà)效果
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類(lèi),我為了只是達(dá)到進(jìn)入到另一個(gè)界面的這種效果,所以代碼比較簡(jiǎn)單,就是調(diào)用了一個(gè)layout布局頁(yè)面,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)頁(yè)
- Android開(kāi)發(fā)實(shí)戰(zhàn)之漂亮的ViewPager引導(dǎo)頁(yè)
- Android控件ViewPager實(shí)現(xiàn)帶有動(dòng)畫(huà)的引導(dǎo)頁(yè)
- Android開(kāi)發(fā)實(shí)現(xiàn)的ViewPager引導(dǎo)頁(yè)功能(動(dòng)態(tài)加載指示器)詳解
- Android利用ViewPager實(shí)現(xiàn)用戶引導(dǎo)界面效果的方法
- Android UI設(shè)計(jì)與開(kāi)發(fā)之使用ViewPager實(shí)現(xiàn)歡迎引導(dǎo)頁(yè)面
- Android UI設(shè)計(jì)與開(kāi)發(fā)之ViewPager介紹和簡(jiǎn)單實(shí)現(xiàn)引導(dǎo)界面
- android使用ViewPager組件實(shí)現(xiàn)app引導(dǎo)查看頁(yè)面
- Android自定義引導(dǎo)玩轉(zhuǎn)ViewPager的方法詳解
相關(guān)文章
開(kāi)箱即用的Google與百度定位坐標(biāo)系轉(zhuǎn)換實(shí)例
這篇文章主要為大家介紹了開(kāi)箱即用的Google與百度定位坐標(biāo)系轉(zhuǎn)換實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼
這篇文章主要介紹了Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法
本篇文章主要介紹了Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Android學(xué)習(xí)筆記(二)App工程文件分析
之前寫(xiě)過(guò)一篇關(guān)于安卓環(huán)境配置以及第一個(gè)app的制作過(guò)程,下面我們來(lái)進(jìn)一步,分析下APP工程文件2014-07-07
Android自定義PopupWindow簡(jiǎn)單小例子
這篇文章主要為大家詳細(xì)介紹了Android自定義PopupWindow簡(jiǎn)單小例子,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android開(kāi)發(fā)Kotlin語(yǔ)言協(xié)程的依賴及使用示例
這篇文章主要為大家介紹了Android開(kāi)發(fā)Kotlin語(yǔ)言協(xié)程的依賴及使用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Android中的webview監(jiān)聽(tīng)每次URL變化實(shí)例
這篇文章主要介紹了Android中的webview監(jiān)聽(tīng)每次URL變化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

