Android實(shí)現(xiàn)漸變啟動(dòng)頁(yè)和帶有指示器的引導(dǎo)頁(yè)
引導(dǎo)頁(yè)是項(xiàng)目中很常見的東西了,在用戶下載app首次打開后,會(huì)進(jìn)入引導(dǎo)界面,通常都是三四張圖片說(shuō)明,簡(jiǎn)單介紹下app的功能和使用方法之類,最后一張有著“進(jìn)入應(yīng)用”的按鈕,點(diǎn)擊即可進(jìn)入主頁(yè),之后打開app則不會(huì)再次進(jìn)入啟動(dòng)頁(yè),話不多說(shuō),以下做個(gè)歸納。
效果圖:

實(shí)現(xiàn)步驟:
1.首先我們做個(gè)有漸變動(dòng)畫的啟動(dòng)頁(yè)面SplashActivity
在onCreate里設(shè)置核心方法setAlphaAnimation()
public void setAlphaAnimation(){
//生成AlphaAnimation的對(duì)象
AlphaAnimation animation= new AlphaAnimation(this);
//設(shè)置動(dòng)畫的持續(xù)時(shí)間
animation.setDuration(3000);
//給要漸變的控件設(shè)置動(dòng)畫,比如說(shuō)imageview,textview,linearLayout之類的
ll.setAnimation(animation);
//設(shè)置動(dòng)畫監(jiān)聽,結(jié)束時(shí)跳轉(zhuǎn)到下一個(gè)頁(yè)面(首次打開就是引導(dǎo)頁(yè)面,反之就是主頁(yè))
animation.setAnimationListener(new Animation.AnimationListener(){
public void onAnimationStart(Animation animation){ }
public void onAnimationEnd(Animation animation){
jump2Activity();
}
public void onAnimationRepeat(Animation animation){ }
});
}
分析一下這個(gè)跳轉(zhuǎn)方法jump2Activity(),我們這里使用SharedPeference來(lái)判斷應(yīng)用是否首次打開,設(shè)變量isFirst默認(rèn)值為0,進(jìn)入引導(dǎo)頁(yè)跳轉(zhuǎn)到主頁(yè)時(shí)再把這個(gè)值設(shè)為1,這樣,每次跳轉(zhuǎn)時(shí)判斷isFirst的值,如果仍是默認(rèn)值0則為首次打開進(jìn)入引導(dǎo)頁(yè),反之進(jìn)入主頁(yè)。
public void jump2Activity(){
SharedPreferences sharedPreference= getSharedPreferences("data", MODE_PRIVATE);
String isFirst= sharedPreferences.getString("isFirst", "0");
Intent intent= new Intent();
if("0".equals(isFirst)){
intent.setClass(this, GuideActivity.class);
}else{
intent.setClass(this. MainActivity.class);
}
startActivity(intent);
finish();
}
2.接下來(lái)我們做引導(dǎo)頁(yè)面
引導(dǎo)頁(yè)面是由三個(gè)控件組成,Viewpager,圓點(diǎn)指示器的線性布局linearlayout, 最后一頁(yè)的 “進(jìn)入應(yīng)用” 按鈕。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/guide_vp" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/guide_ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="100dp" android:orientation="horizontal" /> <Button android:id="@+id/guide_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/guide_ll" android:layout_centerHorizontal="true" android:text="進(jìn)入應(yīng)用" android:layout_marginBottom="10dp" android:visibility="gone"/> </RelativeLayout>
在GuideActivity中,首先初始化引導(dǎo)圖片
/**
* 初始化圖片
*/
private void initImgs() {
ViewPager.LayoutParams params= new ViewPager.LayoutParams();
imageViews= new ArrayList<ImageView>();
for (int i= 0; i< imgs.length; i++){
ImageView imageView= new ImageView(this);
imageView.setLayoutParams(params);
imageView.setImageResource(imgs[i]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageViews.add(imageView);
}
}
初始化底部圓點(diǎn)指示器,這里值得一提的是我們給各圓點(diǎn)設(shè)置相應(yīng)的點(diǎn)擊事件,當(dāng)點(diǎn)擊某個(gè)位置的圓點(diǎn)時(shí),viewpager自動(dòng)切換到相應(yīng)位置的圖片,不過(guò)實(shí)際應(yīng)用中這里實(shí)用性不是很大,因?yàn)閳A點(diǎn)太小,可觸摸范圍有限,點(diǎn)擊事件不太好觸發(fā)。
/**
* 初始化底部圓點(diǎn)指示器
*/
private void initDots() {
LinearLayout layout= findViewById(R.id.guide_ll);
LinearLayout.LayoutParams params= new LinearLayout.LayoutParams(20, 20);
params.setMargins(10, 0, 10, 0);
dotViews= new ImageView[imgs.length];
for (int i= 0; i< imageViews.size(); i++){
ImageView imageView= new ImageView(this);
imageView.setLayoutParams(params);
imageView.setImageResource(R.drawable.dotselector);
if (i== 0){
imageView.setSelected(true);
}else{
imageView.setSelected(false);
}
dotViews[i]= imageView;
final int finalI = i;
dotViews[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
vp.setCurrentItem(finalI);
}
});
layout.addView(imageView);
}
}
設(shè)置viewpager的滑動(dòng)事件
vp.addOnPageChangeListener(this);
生成三個(gè)方法,我們主要在onPageSelected()方法中做操作,當(dāng)某個(gè)位置的圓點(diǎn)被選中時(shí),顯示選中后的圖片,其余圓點(diǎn)顯示未選中的圖片,這里主要應(yīng)用selector控制器,至于相應(yīng)的選中未選中圓點(diǎn)圖片需要大家去找。當(dāng)滑動(dòng)到最后一個(gè)頁(yè)面時(shí),將 "進(jìn)入應(yīng)用" 的按鈕顯示,反之隱藏。
@Override
public void onPageScrolled(int i, float v, int i1) {}
@Override
public void onPageScrollStateChanged(int i) {}
@Override
public void onPageSelected(int arg0) {
for (int i= 0; i< dotViews.length; i++){
if (arg0== i){
dotViews[i].setSelected(true);
}else {
dotViews[i].setSelected(false);
}
if (arg0== dotViews.length- 1){
btn.setVisibility(View.VISIBLE);
}else {
btn.setVisibility(View.GONE);
}
}
}
dotSelector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/focus_on" android:state_selected="true"/> <item android:drawable="@drawable/focus_nomal" android:state_selected="false"/> </selector>
在最后一個(gè)頁(yè)面點(diǎn)擊 "進(jìn)入應(yīng)用" 按鈕跳轉(zhuǎn)到主頁(yè)時(shí),將緩存中的isFirst數(shù)據(jù)改為1,以后打開應(yīng)用則不會(huì)再進(jìn)入引導(dǎo)頁(yè)面了。
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.guide_btn:
setisFirst();
Intent intent= new Intent(GuideActivity.this, MainActivity.class);
startActivity(intent);
finish();
break;
}
}
/**
* 改變首次打開的狀態(tài)
*/
private void setisFirst() {
SharedPreferences.Editor editor= getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("isFirst", "1");
editor.commit();
}
至此全部完成!demo附上
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用ViewPager實(shí)現(xiàn)啟動(dòng)引導(dǎo)頁(yè)效果
- android引導(dǎo)用戶開啟自啟動(dòng)權(quán)限的方法
- Android客戶端首次啟動(dòng)引導(dǎo)界面
- Android實(shí)現(xiàn)過(guò)渡動(dòng)畫、引導(dǎo)頁(yè) Android判斷是否第一次啟動(dòng)App
- Android UI設(shè)計(jì)與開發(fā)之實(shí)現(xiàn)應(yīng)用程序只啟動(dòng)一次引導(dǎo)界面
- Android使用ViewPager實(shí)現(xiàn)啟動(dòng)引導(dǎo)頁(yè)
- Android實(shí)現(xiàn)啟動(dòng)引導(dǎo)圖
相關(guān)文章
Android動(dòng)態(tài)添加menu菜單的簡(jiǎn)單方法
Android動(dòng)態(tài)添加menu菜單的簡(jiǎn)單方法,需要的朋友可以參考一下2013-06-06
Android實(shí)現(xiàn)粒子中心擴(kuò)散動(dòng)畫效果
粒子動(dòng)畫效果相比其他動(dòng)畫來(lái)說(shuō)是非常復(fù)雜了的,主要涉及三個(gè)方面,粒子初始化、粒子位移、粒子回收等問題,本篇將實(shí)現(xiàn)兩種動(dòng)畫效果,代碼基本相同,只是旋轉(zhuǎn)速度不一樣,需要的朋友可以參考下2024-02-02
Android神兵利器之Image Asset Studio的實(shí)現(xiàn)
這篇文章主要介紹了Android神兵利器之Image Asset Studio的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Flutter?將Dio請(qǐng)求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫(kù)的實(shí)現(xiàn)方案
這篇文章主要介紹了Flutter?將Dio請(qǐng)求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫(kù),需要注意添加NativeNetInterceptor,如果有多個(gè)攔截器,例如LogInterceptors等等,需要將NativeNetInterceptor放到最后,需要的朋友可以參考下2022-05-05
Android實(shí)現(xiàn)帶圓環(huán)的圓形頭像
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶圓環(huán)的圓形頭像,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
Android基于ListView實(shí)現(xiàn)類似Market分頁(yè)加載效果示例
這篇文章主要介紹了Android基于ListView實(shí)現(xiàn)類似Market分頁(yè)加載效果,結(jié)合完整實(shí)例形式分析了ListView的OnScroll方法來(lái)實(shí)現(xiàn)分頁(yè)與滾動(dòng)加載的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-10-10
Android學(xué)習(xí)教程之日歷庫(kù)使用(15)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之日歷庫(kù)使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11

