在进行app开发的过程中,我们经常会用到这种效果,在第一次打开app 的时候会进入一系列的图片滑动界面,也就是我们经常说的引导界面,但是在第一次打开以后,就不会再进去这个引导界面,而是显示一个splash界面以后直接跳转到主界面
具体的效果图我就不贴上来了,首先我们应该创建三个xml文件 分别是如下图片中的三个:
其中activity_main没有什么要特殊设置的,其他的两个布局文件分别如下所示:
activity_splash的布局代码:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/splash" /> </FrameLayout>
activity_guid的代码如下所示:
<?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:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> <!-- <com.itheima.news06.act.view.CustomViewPager --> <!-- android:id="@+id/viewpager" --> <!-- android:layout_width="match_parent" --> <!-- android:layout_height="match_parent" > --> <!-- </com.itheima.news06.act.view.CustomViewPager> --> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="25dp" android:text="进入主界面" android:visibility="invisible" /> <RelativeLayout android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="15dp" android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:id="@+id/ll_point_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> <View android:id="@+id/dot_focus" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/dot_focus" /> </RelativeLayout> </RelativeLayout>
在这个布局文件中用到了v4包下的ViewPager,将v4包导入以后build一下,然后再引用就可以了.
最主要的是我们的逻辑,上述功能的逻辑是首先进入splash这个界面,进入了以后进行判断,看是否是第一次进入这个app如果是第一次,那么久直接跳转到guidActivity,如果不是第一次那么就直接跳转到主界面,在书写的过程中要将是否是第一次进入这个进行存储,在进行滑动切换这个逻辑中,最主要的就是设置adapter然后进行相关的切换.
SplashActivity的跳转逻辑代码如下所示:
package com.iFly.chan.ui; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import com.iFly.chan.MainActivity; import com.iFly.chan.R; import com.iFly.chan.utils.SharedPreferenTool; public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); //延迟三秒以后启动,如果是第一次启动就进入引导界面,不是第一次启动就进入主界面 new Handler().postDelayed(new Runnable() { @Override public void run() { boolean isFirst = SharedPreferenTool.getBoolean(getApplicationContext(), "isfirst", false); if (isFirst) { //第二次打开直接进入主界面 Intent intent = new Intent(SplashActivity.this,MainActivity.class); startActivity(intent); SplashActivity.this.finish(); }else { //第一次打开进入引导界面 //记录第一次进入的状态值 isFirst = true; SharedPreferenTool.saveBoolean(getApplicationContext(), "isfirst", isFirst); Intent intent = new Intent(SplashActivity.this,GuidActivity.class); startActivity(intent); finish(); } } }, 2000); } }
在进行判断是否是第一次以后,要把相关的isFirst的值进行修改,然后进行存储,否则的话会导致操作无效
如果是第一次进入这个app,那么久跳转到相应的guidActivity这个界面进行滑动切换的操作,GuidActivity的逻辑代码如下所示:
package com.iFly.chan.ui; import java.util.ArrayList; import java.util.List; import com.iFly.chan.MainActivity; import com.iFly.chan.R; import com.iFly.chan.ui.view.RotatePageTransformer; import com.iFly.chan.utils.DensityUtil; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; public class GuidActivity extends Activity { // 引导界面图片的集合 private int[] imageResId = { R.drawable.fo1, R.drawable.pu1, R.drawable.pu2 }; private LinearLayout ll_point_group; private View dot_focus; private ViewPager viewpager; private Button button; private List<ImageView> images; private int dot_width; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_guid); // 界面初始化的方法 initView(); } /** * 界面初始化的方法 */ private void initView() { ll_point_group = (LinearLayout) findViewById(R.id.ll_point_group); dot_focus = findViewById(R.id.dot_focus); viewpager = (ViewPager) findViewById(R.id.viewpager); button = (Button) findViewById(R.id.button); // 跳转按钮的点击事件 点击跳转到主界面 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(GuidActivity.this, MainActivity.class); startActivity(intent); GuidActivity.this.finish(); } }); // 数据初始化的方法 initData(); //对不同的切换页面进行设置相对应的图片 viewpager.setAdapter(new GuideAdapter()); //设置切换页面的方式 viewpager.setPageTransformer(true, new RotatePageTransformer()); //设置page的点击滑动监听事件 viewpager.setOnPageChangeListener(new OnPageChangeListener() { //对选中的页面进行判断 决定是否可以显示button @Override public void onPageSelected(int position) { // TODO Auto-generated method stub
if (position == images.size() - 1) { //是最后一张切换的图片 显示跳转按钮 button.setVisibility(View.VISIBLE); }else { //不是最后一张切换的图片 不显示跳转按钮 button.setVisibility(View.GONE); } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // TODO Auto-generated method stub //根据计算,实时设置选中点的平移,让他跟随我们手指进行滑动 int translationX = (int) (dot_width*(position + positionOffset)); dot_focus.setTranslationX(translationX); } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); //切换的时候下面的小点也随之改变颜色的操作 dot_focus.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub dot_width = ll_point_group.getChildAt(1).getLeft() - ll_point_group.getChildAt(0).getLeft(); System.out.println("dot_width="+dot_width); } }, 20); } /** * 数据初始化的方法 */ private void initData() { // 创建一个集合用来存储相关的imageview images = new ArrayList<ImageView>(); // 遍历图片的id将图片添加到集合中去 for (int i = 0; i < imageResId.length; i++) { ImageView iv = new ImageView(getApplicationContext()); iv.setBackgroundResource(imageResId[i]); images.add(iv); // 设置下面的指示小点 View view = new View(getApplicationContext()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( DensityUtil.dip2px(getApplicationContext(), 10), DensityUtil.dip2px(getApplicationContext(), 10)); if (i != 0) { params.leftMargin = DensityUtil.dip2px(getApplicationContext(), 10); } view.setBackgroundResource(R.drawable.dot_normal); view.setLayoutParams(params); ll_point_group.addView(view); } } private class GuideAdapter extends PagerAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return images.size(); } @Override public boolean isViewFromObject(View view, Object object) { // TODO Auto-generated method stub return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub container.addView(images.get(position)); return images.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub container.removeView((View) object); } } }以上就是这个功能的相关代码逻辑,但是大家不要忘记了在manifest这个文件中进行相关的注册等操作,代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.iFly.chan" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" > <activity android:name="com.iFly.chan.MainActivity" android:label="@string/app_name" > </activity> <!-- 欢迎界面的Activity --> <activity android:name=".ui.SplashActivity" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 引导界面的activity --> <activity android:name=".ui.GuidActivity" > </activity> </application> </manifest>