在App開(kāi)中首先跟用戶進(jìn)行交互的事Splash頁(yè)面,也就是引導(dǎo)頁(yè)面,一般是更新了什么內(nèi)容,或者有什么樣的活動(dòng),怎樣操作等,現(xiàn)在越來(lái)越多的應(yīng)用引導(dǎo)頁(yè)面越來(lái)越炫彩,所以引導(dǎo)頁(yè)面在你app用戶好感度上也有重大的關(guān)系。 例如:
進(jìn)入頁(yè)面之后,根據(jù)頁(yè)面版本判斷時(shí)候更新,彈出更新 對(duì)話框,True就進(jìn)入下載安裝頁(yè)面功能,false就跳轉(zhuǎn)到主頁(yè) 布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/splash" > <!-- shadowColor : 陰影的顏色 shadowDx : x軸偏移量 shadowRadius : 偏移的角度 --> <TextView android:id="@+id/splash_tv_version" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="版本:1.0" android:textSize="18sp" android:textColor="#FFFFFF" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" android:shadowColor="#FF0000" android:shadowDx="1" android:shadowDy="1" android:shadowRadius="2" /></RelativeLayout>public class SplashActivity extends Activity { /**請(qǐng)求路徑**/ PRivate static final String CONNECTURL = "http://10.0.2.2:8080/updateinfo.html"; /**保存的路徑**/ private static final String SAVEURL = "mnt/sdcard/mobliesafe97_2.apk"; private TextView mVersion; private int mNewsVersion; private String mNewsUrl; private String mNewsMsg; private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //requestWindowFeature(Window.FEATURE_NO_TITLE);//去除標(biāo)題欄,必須放在setContentView之前執(zhí)行,而且只在當(dāng)前的activity生效 setContentView(R.layout.activity_splash); initView(); } /** * 初始化控件 */ private void initView() { mVersion = (TextView) findViewById(R.id.splash_tv_version); //獲取當(dāng)前應(yīng)用程序的版本號(hào)碼,設(shè)置給textview展示 mVersion.setText("版本:"+PackageTool.getVersionName(this)); //延遲兩秒鐘中請(qǐng)求服務(wù)器進(jìn)行更新版本操作 //update(); //延遲多長(zhǎng)時(shí)間給handler發(fā)送消息 //參數(shù)1:handler接受到消息執(zhí)行的操作 //參數(shù)2:延遲的事件 /*new Handler().postDelayed(new Runnable() { @Override public void run() { update(); } }, 2000);*/ //延遲多長(zhǎng)時(shí)間給handler發(fā)送消息 new Handler(){ public void handleMessage(android.os.Message msg) { update(); }; }.sendEmptyMessageDelayed(0, 2000);//what:消息的標(biāo)示;delayMillis:延遲時(shí)間 } /** * 更新版本操作 */ private void update() { //1.鏈接服務(wù)器,獲取服務(wù)器數(shù)據(jù),判斷是否有最新版本 //1.1.鏈接服務(wù)器,聯(lián)網(wǎng)操作,子線程,權(quán)限,HttpUrlConnection xutils httpclient volly okhttp //參數(shù):鏈接超時(shí)時(shí)間 HttpUtils httpUtils = new HttpUtils(2000); //參數(shù)1:請(qǐng)求方式 //參數(shù)2:請(qǐng)求路徑 //參數(shù)3:請(qǐng)求的參數(shù) //參數(shù)4:RequestCallBack請(qǐng)求回調(diào) httpUtils.send(HttpMethod.GET, CONNECTURL, null, new RequestCallBack<String>() { //請(qǐng)求成功調(diào)用的方法 @Override public void onSuccess(ResponseInfo<String> responseInfo) { //1.2.獲取服務(wù)器返回的數(shù)據(jù),問(wèn)題:服務(wù)器返回那些數(shù)據(jù):code:新版本的版本號(hào) apkurl:新版本的下載地址 msg:新版本的描述信息,描述更新的內(nèi)容的 //問(wèn)題:需要知道服務(wù)器如何封裝數(shù)據(jù) xml json String json = responseInfo.result;//獲取服務(wù)器返回的數(shù)據(jù) System.out.println(json); //1.2.1.解析獲取到j(luò)son數(shù)據(jù) processJSON(json); } //請(qǐng)求失敗調(diào)用的方法 @Override public void onFailure(HttpException arg0, String arg1) { //請(qǐng)求失敗的時(shí)候跳轉(zhuǎn)到首頁(yè) enterHome(); } }); } /** * 1.2.1.解析獲取到j(luò)son數(shù)據(jù) * @param json */ protected void processJSON(String json) { try { JSONObject jsonObject = new JSONObject(json); mNewsVersion = jsonObject.getInt("code"); mNewsUrl = jsonObject.getString("apkurl"); mNewsMsg = jsonObject.getString("msg"); System.out.println("code:"+mNewsVersion+" apkurl:"+mNewsUrl+" msg:"+mNewsMsg); //1.3.判斷是否有最新版本 //判斷服務(wù)器中新版本的版本號(hào)和當(dāng)前應(yīng)用程序的版本號(hào)是否一致,一致:沒(méi)有最新版本,不一致:有最新版本 if (mNewsVersion == PackageTool.getVersionCode(this)) { //一致:沒(méi)有最新版本 //跳轉(zhuǎn)到首頁(yè) enterHome(); }else{ //不一致:有最新版本 //2.彈出更新版本的對(duì)話框 showUpdateDialog(); } } catch (JSONException e) { e.printStackTrace(); } } /** * 跳轉(zhuǎn)首頁(yè)的操作 */ protected void enterHome() { Intent intent = new Intent(this,HomeActivity.class); startActivity(intent); finish();//移除/結(jié)束當(dāng)前的activity,在跳轉(zhuǎn)成功之后,移除SplashActivity,這樣當(dāng)從HomActivity點(diǎn)擊返回鍵返回的時(shí)候,因?yàn)椴粫?huì)找到SplashActivity所以會(huì)直接退出應(yīng)用程序 } /** * 2.創(chuàng)建提醒用戶更新版本的對(duì)話框 */ private void showUpdateDialog() { AlertDialog.Builder builder = new Builder(this); //builder.setCancelable(false);//設(shè)置對(duì)話框是否可以消失,true:可以;false:不可以,屏蔽返回鍵 //設(shè)置對(duì)話框的標(biāo)題 builder.setTitle("最新版本:"+mNewsVersion+".0"); //設(shè)置圖標(biāo) builder.setIcon(R.drawable.ic_launcher); //設(shè)置對(duì)話框內(nèi)容 builder.setMessage(mNewsMsg); //監(jiān)聽(tīng)對(duì)話框消失的時(shí)候 builder.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { //跳轉(zhuǎn)到首頁(yè)的操作 dialog.dismiss(); enterHome(); } }); //創(chuàng)建按鈕 builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //隱藏對(duì)話框,下載最新版本apk dialog.dismiss(); //3.下載最新版本apk downloadAPK(); } }); builder.setNegativeButton("以后再說(shuō)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //隱藏對(duì)話框,跳轉(zhuǎn)到首頁(yè) dialog.dismiss(); enterHome(); } }); //展示對(duì)話框 builder.show(); //builder.create().show();//相同的效果 } /** * 3.下載最新版的apk */ protected void downloadAPK() { //判斷SD卡是否掛載 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //3.2.在下載的時(shí)候,彈出進(jìn)度條的對(duì)話框 showProgressDialog(); //3.1.從服務(wù)器下載,聯(lián)網(wǎng)操作 HttpUtils httpUtils = new HttpUtils(); //下載操作 //問(wèn)題:1.設(shè)置下載路徑;2.SD卡權(quán)限;3.判斷SD卡是否掛載成功;4.生成一個(gè)2.0版本的apk存放到服務(wù)器 //參數(shù)1:下載的路徑 //參數(shù)2:保存的路徑 //參數(shù)3:下載回調(diào) httpUtils.download(mNewsUrl, SAVEURL, new RequestCallBack() { @Override public void onSuccess(ResponseInfo arg0) { //下載成功,隱藏進(jìn)度條對(duì)話框 progressDialog.dismiss(); //4.安裝最新版本apk installAPK(); } @Override public void onFailure(HttpException arg0, String arg1) { //下載失敗,隱藏進(jìn)度條,通知跳轉(zhuǎn)到首頁(yè) progressDialog.dismiss(); enterHome(); } //更新下載進(jìn)度 //total : 總進(jìn)度 //current : 當(dāng)前的下載進(jìn)度 //isUploading : 是否支持回調(diào)上傳 @Override public void onLoading(long total, long current, boolean isUploading) { super.onLoading(total, current, isUploading); //設(shè)置進(jìn)度條顯示總進(jìn)度和下載進(jìn)度 progressDialog.setMax((int) total);//設(shè)置總進(jìn)度 progressDialog.setProgress((int) current);//設(shè)置當(dāng)前下載的進(jìn)度 } }); }else{ Toast.makeText(getapplicationContext(), "沒(méi)有可用的SD卡", 0).show(); } } /** * 3.2.顯示下載進(jìn)度的對(duì)話框 */ private void showProgressDialog() { progressDialog = new ProgressDialog(this); progressDialog.setCancelable(false);//設(shè)置對(duì)話框是否可以消失,true:可以;false:不可以,屏蔽返回鍵 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//設(shè)置進(jìn)度條對(duì)話框中進(jìn)度的樣式 progressDialog.show();//顯示dialog } /** * 4.安裝最新版本apk */ protected void installAPK() { //通過(guò)隱式意圖打開(kāi)系統(tǒng)的安裝界面 /** * <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="content" />// content:// <data android:scheme="file" /> <data android:mimeType="application/vnd.android.package-archive" /> </intent-filter> */ Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); //相互覆蓋 /*intent.setData(Uri.fromFile(new File(SAVEURL))); intent.setType("application/vnd.android.package-archive");*/ intent.setDataAndType(Uri.fromFile(new File(SAVEURL)), "application/vnd.android.package-archive"); //startActivity(intent); //當(dāng)當(dāng)前的activity退出的時(shí)候,回調(diào)之前activity的onactivityReulst方法 //requestCode : 請(qǐng)求碼 startActivityForResult(intent, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //跳轉(zhuǎn)首頁(yè)的操作 enterHome(); }}進(jìn)入應(yīng)用引導(dǎo)頁(yè)面,首先全屏展示一段視頻之后,出現(xiàn)引導(dǎo)圖ViewPager滑動(dòng) activity_splash.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <!-- 播放視頻資源的控件,特性:根據(jù)視頻的寬高決定控件的寬高 --> <com.ui.CustomVideoView android:id="@+id/splash_vv_videoview" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/splash_btn_enter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="進(jìn)入" android:textColor="#000000" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="30dp" android:onClick="enter" /></RelativeLayout>activity_guide.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <android.support.v4.view.ViewPager android:id="@+id/guide_vp_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" ></android.support.v4.view.ViewPager> <Button android:id="@+id/guide_btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="開(kāi)始體驗(yàn)" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="50dp" android:background="@drawable/selector_guide_btn_bg" android:paddingLeft="10dp" android:paddingRight="10dp" android:textColor="@color/selector_guide_btn_textcolor" android:textSize="14sp" android:visibility="gone" android:onClick="start" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="30dp" > <LinearLayout android:id="@+id/guide_ll_dot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> <ImageView android:id="@+id/guide_iv_reddot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/shape_guide_red_dot" /> </RelativeLayout>SplashActivity 短視頻播放
public class SplashActivity extends Activity { private CustomVideoView mVideoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); mVideoView = (CustomVideoView) findViewById(R.id.splash_vv_videoview); // 播放視頻 initData(); } /** * 播放視頻 */ private void initData() { // 1.獲取播放資源 // android.resource:// : 獲取工程中的res->raw中的資源 // android.resource://工程的包名/R.raw.kr36 mVideoView.setVideoURI(Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.kr36)); //3.監(jiān)聽(tīng)視頻是否播放完畢,如果播放完畢,重新開(kāi)始播放 //監(jiān)聽(tīng)視頻是否播放完畢的操作 mVideoView.setOnCompletionListener(new OnCompletionListener() { //當(dāng)視頻播放完畢調(diào)用的方法 @Override public void onCompletion(MediaPlayer mp) { //重新播放 mVideoView.start(); } }); // 2.播放視頻資源 mVideoView.start(); } /** * 進(jìn)入主頁(yè)面按鈕的點(diǎn)擊事件 */ public void enter(View view){ //判斷用戶是否是第一個(gè)進(jìn)入應(yīng)用,如果是:跳轉(zhuǎn)引導(dǎo)界面,如果不是:跳轉(zhuǎn)首頁(yè) //問(wèn)題:如何判斷用戶是否是第一次進(jìn)入應(yīng)用 //獲取用戶是否是第一次進(jìn)入的標(biāo)示 //還沒(méi)有保存數(shù)據(jù),保存數(shù)據(jù)需要到引導(dǎo)界面的開(kāi)始體驗(yàn)按鈕中去做,true:標(biāo)示第一次進(jìn)入,false:不是 boolean isfirstenter = SharedPreferencesTool.getBoolean(this, Constants.ISFIRSTENTER, true); if (isfirstenter) { //第一次進(jìn)入跳轉(zhuǎn)到引導(dǎo)界面 startActivity(new Intent(this,GuideActivity.class)); }else{ //不是第一次進(jìn)入跳轉(zhuǎn)到首頁(yè) startActivity(new Intent(this,HomeActivity.class)); } finish(); }GuideActivity 圖片引導(dǎo)頁(yè)面
public class GuideActivity extends Activity { private ViewPager mViewPager; //資源圖片 private int[] mImageIds = new int[]{R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3}; private List<ImageView> imageViews; private Button mStart; private LinearLayout mLLDot; private ImageView mRedDot; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//代碼去除標(biāo)題欄 setContentView(R.layout.activity_guide); //通過(guò)第三方框架實(shí)現(xiàn)了沉浸式狀態(tài)欄操作,必須在setContentView之后執(zhí)行 StatusBarUtil.setColor(this, Color.YELLOW); initView(); } /** * 初始化控件 */ private void initView() { mViewPager = (ViewPager) findViewById(R.id.guide_vp_viewpager); mStart = (Button) findViewById(R.id.guide_btn_start); mLLDot = (LinearLayout) findViewById(R.id.guide_ll_dot); mRedDot = (ImageView) findViewById(R.id.guide_iv_reddot); imageViews = new ArrayList<ImageView>(); imageViews.clear(); //通過(guò)viewpager展示的三張圖片 //先將圖片,放到imageView中,然后再將ImageView放到viewpager中展示 //1.根據(jù)圖片的張數(shù),創(chuàng)建相應(yīng)個(gè)數(shù)的imageView,并存放,方便viewpager展示 for (int i = 0; i < mImageIds.length; i++) { //創(chuàng)建相應(yīng)的imageView createImageView(i); //根據(jù)圖片的張數(shù),創(chuàng)建點(diǎn)的個(gè)數(shù) createDot(); } //2.通過(guò)viewpager展示imageView mViewPager.setAdapter(new Myadapter()); //4.實(shí)現(xiàn)viewpager的界面切換動(dòng)畫(huà) //mViewPager.setPageTransformer(true, new ZoomOutPageTransformer()); //設(shè)置viewpager切換動(dòng)畫(huà)的, //參數(shù)1:如果是第一個(gè)到最后一個(gè):true,如果是最后一個(gè)到第一個(gè):false //參數(shù)2:自定義的動(dòng)畫(huà)效果 //mViewPager.setPageTransformer(true, new DepthPageTransformer()); mViewPager.setPageTransformer(true, new RotatePageTransformer()); //3.實(shí)現(xiàn)viewpager的界面切換監(jiān)聽(tīng),監(jiān)聽(tīng)當(dāng)切換到第三個(gè)界面的時(shí)候,顯示按鈕,否則隱藏按鈕 //跟setOnPageChangeListener效果是一樣 mViewPager.addOnPageChangeListener(new OnPageChangeListener() { //當(dāng)界面切換完成調(diào)用的方法 //position : 切換到的界面的索引 @Override public void onPageSelected(int position) { //判斷如果已經(jīng)切換到第三個(gè)界面了,顯示按鈕,否則隱藏按鈕 if (position == imageViews.size()-1) { mStart.setVisibility(View.VISIBLE); }else{ mStart.setVisibility(View.GONE); } } //viewpager切換界面的時(shí)候調(diào)用的方法 //position : 條目的索引 //positionOffset : 界面移動(dòng)的百分比 //positionOffsetPixels : 界面移動(dòng)的像素 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //當(dāng)viewpager切換界面的時(shí)候,實(shí)現(xiàn)移動(dòng)紅色的點(diǎn) //translationX : 控件平移的距離,從右往左滑動(dòng)從0開(kāi)始慢慢變大,如果切換完成,百分比瞬間歸0,重新從0開(kāi)始,進(jìn)行下一次的百分比計(jì)算 System.out.println(positionOffset+""); //紅色點(diǎn)的移動(dòng)距離 = 移動(dòng)的百分比*20 // 0 * 20 = 0 1*20=20 //mRedDot.setTranslationX(positionOffset * 20 + position * 20); mRedDot.setTranslationX((positionOffset+ position) * 20); } //當(dāng)切換狀態(tài)改變的時(shí)候調(diào)用的方法 @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub } }); } /** * 創(chuàng)建圖片對(duì)應(yīng)的imageView * i:表示創(chuàng)建第幾個(gè)圖片對(duì)應(yīng)的imageView */ private void createImageView(int i) { ImageView imageView = new ImageView(this); imageView.setBackgroundResource(mImageIds[i]); imageViews.add(imageView); } /** * 根據(jù)圖片的張數(shù)創(chuàng)建點(diǎn) */ private void createDot() { View view = new View(this); view.setBackgroundResource(R.drawable.shape_guide_dot); LinearLayout.LayoutParams params = new LayoutParams(10, 10); params.rightMargin=10; view.setLayoutParams(params);//將屬性設(shè)置給view對(duì)象,使用屬性生效 //添加linearlayout中展示 mLLDot.addView(view); } /**ViewPager的adapter**/ private class Myadapter extends PagerAdapter{ //設(shè)置條目個(gè)數(shù) @Override public int getCount() { return imageViews.size(); } //view:viewpager的頁(yè)面對(duì)象 //object:instantiateItem返回對(duì)象 //判斷是否可以加載顯示界面 @Override public boolean isViewFromObject(View view, Object object) { return view == object; } //添加顯示viewpager的界面 @Override public Object instantiateItem(ViewGroup container, int position) { //根據(jù)條目的索引,獲取條目對(duì)應(yīng)的imageview ImageView imageView = imageViews.get(position); //將imageView添加到viewpager中顯示 container.addView(imageView); //添加什么View對(duì)象,返回什么view對(duì)象 return imageView; } //刪除條目 //object : instantiateItem的返回值 @Override public void destroyItem(ViewGroup container, int position, Object object) { //super.destroyItem(container, position, object);拋異常的 container.removeView((View) object); } } /** * 開(kāi)始體驗(yàn)按鈕的點(diǎn)擊事件 */ public void start(View view){ //保存是否是第一次進(jìn)入的標(biāo)示 SharedPreferencesTool.saveBoolean(this, Constants.ISFIRSTENTER, false); //跳轉(zhuǎn)的首頁(yè) startActivity(new Intent(this,HomeActivity.class)); //移除引導(dǎo)界面,避免在首頁(yè)點(diǎn)擊返回鍵,再回退到引導(dǎo)界面 finish(); }}1. 要使用ViewPager,必須要?jiǎng)?chuàng)建 PagerAdapter。 這里創(chuàng)建一個(gè) ViewPagerAdapter來(lái)繼承PagerAdapter
public class ViewPagerAdapter extends PagerAdapter{ private List<View> views; // 我們引導(dǎo)頁(yè)的list private Context context; // 上下文 public ViewPagerAdapter(List<View> views, Context context) { this.views = views; this.context = context; } // 移除一個(gè)view @Override public void destroyItem(ViewGroup container, int position, Object object) { //super.destroyItem(container, position, object); container.removeView(views.get(position)); } // 加載一個(gè)view @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(views.get(position)); return views.get(position); } @Override public int getCount() { // 必寫(xiě)的方法 返回當(dāng)前views的數(shù)量 return this.views.size(); } @Override public boolean isViewFromObject(View view, Object object) { //必寫(xiě)的方法 判斷當(dāng)前的view是否是我們需要的對(duì)象 return (view == object); }}2. 創(chuàng)建我們引導(dǎo)頁(yè)的視圖
<?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"> <!--filpInterval 設(shè)置View之間切換的時(shí)間間隔 (在androidStudio上面跑不起來(lái) 可以不需要) persistentDrawingCache 持久化繪畫(huà)緩存 --> <android.support.v4.view.ViewPager android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00000000" android:persistentDrawingCache="animation" android:id="@+id/viewpage" > </android.support.v4.view.ViewPager></RelativeLayout>3. 創(chuàng)建引導(dǎo)頁(yè)的圖片視圖 one.xml和two.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:background="@drawable/guide1"/></LinearLayout><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView2" android:background="@drawable/guide2"/></LinearLayout>4. 在我們的activity中使用
public class Guide extends Activity{ private ViewPager vp; private ViewPagerAdapter vpAdapter; private List<View> views; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.guide);//加載guide.xml 視圖 this.initView(); System.out.println("onCreate"); } // 初始化view public void initView() { /* * Inflater英文意思是膨脹,在Android中應(yīng)該是擴(kuò)展的意思吧。 LayoutInflater的作用類似于 findViewById(), 不同點(diǎn)是LayoutInflater是用來(lái)找layout文件夾下的xml布局文件,并且實(shí)例化! 而 findViewById()是找具體某一個(gè)xml下的具體 widget控件(如:Button,TextView等)。 * * */ LayoutInflater inflater = LayoutInflater.from(this); views = new ArrayList<View>(); views.add(inflater.inflate(R.layout.one, null)); // 加載視圖1 views.add(inflater.inflate(R.layout.two, null)); // 加載視圖2 vpAdapter = new ViewPagerAdapter(views, this); // 創(chuàng)建我們的 adapter vp = (ViewPager) findViewById(R.id.viewpage); vp.setAdapter(vpAdapter); // viewpage綁定 adapter }}5. 運(yùn)行就有引導(dǎo)頁(yè)的兩張圖片,可以來(lái)回切換。 6. 添加導(dǎo)航點(diǎn) ① 在原來(lái)的guide.xml中添加
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!--filpInterval 設(shè)置View之間切換的時(shí)間間隔 (在androidStudio上面跑不起來(lái) 可以不需要) persistentDrawingCache 持久化繪畫(huà)緩存 --> <android.support.v4.view.ViewPager android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00000000" android:persistentDrawingCache="animation" android:id="@+id/viewpage" android:layout_alignParentTop="true" android:layout_alignParentStart="true"> </android.support.v4.view.ViewPager> <!-- 新添加的 放導(dǎo)航點(diǎn)用的 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_horizontal" android:layout_marginBottom="19dp" android:layout_alignParentBottom="true" android:layout_alignParentStart="true"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv1" android:src="@drawable/login_selectd"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv2" android:src="@drawable/login_point"/> </LinearLayout></RelativeLayout>② 在原來(lái)的代碼的基礎(chǔ)上添加新的代碼
public class Guide extends Activity implements ViewPager.OnPageChangeListener{ // 實(shí)現(xiàn)監(jiān)聽(tīng)接口 private ViewPager vp; private ViewPagerAdapter vpAdapter; private List<View> views; // 導(dǎo)航點(diǎn) private ImageView[] dots; private int[] ids = {R.id.iv1, R.id.iv2}; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.guide);//加載guide.xml 視圖 this.initView(); this.initDots(); System.out.println("onCreate"); } // 初始化view public void initView() { /* * Inflater英文意思是膨脹,在Android中應(yīng)該是擴(kuò)展的意思吧。 LayoutInflater的作用類似于 findViewById(), 不同點(diǎn)是LayoutInflater是用來(lái)找layout文件夾下的xml布局文件,并且實(shí)例化! 而 findViewById()是找具體某一個(gè)xml下的具體 widget控件(如:Button,TextView等)。 * * */ LayoutInflater inflater = LayoutInflater.from(this); views = new ArrayList<View>(); views.add(inflater.inflate(R.layout.one, null)); // 加載視圖1 views.add(inflater.inflate(R.layout.two, null)); // 加載視圖2 vpAdapter = new ViewPagerAdapter(views, this); // 創(chuàng)建我們的 adapter vp = (ViewPager) findViewById(R.id.viewpage); vp.setAdapter(vpAdapter); // viewpage綁定 adapter vp.setOnPageChangeListener(this); // ViewPager 監(jiān)聽(tīng)自己 } private void initDots() { // 初始化 我們的導(dǎo)航點(diǎn) this.dots = new ImageView[this.views.size()]; for (int i=0; i<this.views.size(); i++) { dots[i] = (ImageView) this.findViewById(this.ids[i]); } } // 監(jiān)聽(tīng) 頁(yè)面滑動(dòng)的方法 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { for (int i=0; i<this.ids.length; i++) { if (position == i) { this.dots[i].setImageResource(R.drawable.login_selectd); // 變成選中的 } else { this.dots[i].setImageResource(R.drawable.login_point); //變成不選中的 } } } //選中 @Override public void onPageSelected(int position) { } // 滑動(dòng)狀態(tài)改變 @Override public void onPageScrollStateChanged(int state) { }} 7. 添加進(jìn)入按鈕
① 在two.xml中添加一個(gè)按鈕
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView2" android:background="@drawable/guide2" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" /> <!-- 添加進(jìn)去按鈕 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:orientation="horizontal" android:gravity="center" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="進(jìn)入" android:id="@+id/btn_start" /> </LinearLayout></RelativeLayout>② 監(jiān)聽(tīng)按鈕 進(jìn)去MainActivity
// 進(jìn)入按鈕 this.bt = (Button) views.get(1).findViewById(R.id.btn_start); this.bt.setOnClickListener(new View.OnClickListener() { // 監(jiān)聽(tīng) @Override public void onClick(View v) { Intent i = new Intent(Guide.this, MainActivity.class); // 進(jìn)去MainActivity startActivity(i); finish(); //銷毀當(dāng)前的Activity } });新聞熱點(diǎn)
疑難解答
圖片精選