转载请说明出处:http://blog.csdn.net/qq_17362885/article/details/49962683
本文主要通过一个小demo讲解如何实现软件启动时显示欢迎界面及首次安装显示导航。如有不足之处请指出,让我们相互学习。
先上效果图:
一、使用到的主要技术:SharedPreference,ViewPager
二、欢迎界面
Welcome.java:
package com.example.jc.navitation;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.os.Handler;
/**
* Created by jc on 2015/11/20.
* 通过使用SharedPreference、Handler技术,实现显示welcome界面1.5秒
* 与选择是否显示导航动画
*/
public class WelcomeActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
shipToNavigationOrFrame();
}
//判断且实现应跳转导航动画还是主界面
private void shipToNavigationOrFrame(){
boolean firstFlag; //是否首次安装
SharedPreferences sharedPreferences = getSharedPreferences("flag", MODE_PRIVATE);
firstFlag = sharedPreferences.getBoolean("first", true);
final Intent intent = new Intent();
if (firstFlag){
intent.setClass(this,NavigationActivity.class);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("first", false);
editor.apply(); //apply与commit作用相同,虽没返回值,但效率更高
}else {
intent.setClass(this, FrameActivity.class);
}
new Handler().postDelayed(new Runnable() { //延时1.5秒
@Override
public void run() {
startActivity(intent);
WelcomeActivity.this.finish();
}
},1500);
}
}
布局文件值设置了某张图片为背景,此处就不贴出。
SharedPreference为android中一种存储技术,处理的是key-value对。通常用于存储轻量的数据。
此处主要通过新建了一个“first”表示判断是否为首次安装。
二、ViewPager实现导航界面
navigationActivity.java
package com.example.jc.navitation;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jc on 2015/11/20.
* 通过使用传统的ViewPager技术实现多个页面滑动切换
* 且实现动态确定及添加导航圆点,使程序更具弹性
*/
public class NavigationActivity extends ActionBarActivity {
private ViewPager vPager;
private List<View> vList; //装载各页面的视图
private ImageView[] pointImgViews; //装载导航小圆点
private ViewGroup pointGroup; //与布局文件的小黑点位置ID相关联
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation);
initView();
setViewPager();
addPoints();
setAdapterForViewPager();
}
private void initView(){
vPager = (ViewPager)findViewById(R.id.navigation_vp);
pointGroup = (ViewGroup)findViewById(R.id.viewPoints);
getSupportActionBar().hide();
}
//实现基本滑动切换界面
private void setViewPager(){
LayoutInflater inflater = getLayoutInflater();
vList = new ArrayList<View>();
vList.add(inflater.inflate(R.layout.navigation_page1,null));
vList.add(inflater.inflate(R.layout.navigation_page2,null));
vList.add(inflater.inflate(R.layout.navigation_page3,null));
vList.add(inflater.inflate(R.layout.navigation_page4,null));
vList.add(inflater.inflate(R.layout.navigation_page5,null));
PagerAdapter myAdapter = new PagerAdapter() {
@Override
public int getCount() {
return vList.size();
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view==o;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(vList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(vList.get(position));
return vList.get(position);
}
};
vPager.setAdapter(myAdapter);
}
private void addPoints(){
ImageView pointImgView;
pointImgViews = new ImageView[vList.size()]; //确定小圆点的个数
//动态添加小圆点
for(int i=0; i<vList.size(); i++){
pointImgView = new ImageView(NavigationActivity.this);
pointImgView.setLayoutParams(new ViewGroup.LayoutParams(25,25)); //设置圆点大小
pointImgView.setPadding(5, 0, 5, 0);
pointImgViews[i] = pointImgView;
// 默认选中的是第一张图片,此时第一个小圆点是选中状态,其他不是
if (i == 0)
pointImgViews[i].setImageDrawable(getResources().getDrawable(
R.drawable.page_indicator_focused));
else
pointImgViews[i].setImageDrawable(getResources().getDrawable(
R.drawable.page_indicator_unfocused));
// 将imageviews添加到小圆点视图组
pointGroup.addView(pointImgViews[i]);
}
}
//添加监听器,将相应页面的小圆点设置为选中状态
private void setAdapterForViewPager(){
vPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
for (int i = 0; i < pointImgViews.length; i++) {
// 当前view下设置小圆点为未选中状态
pointImgViews[i].setImageDrawable(getResources().getDrawable(
R.drawable.page_indicator_unfocused));
//设置小圆点为选中状态
if(position == i)
pointImgViews[i].setImageDrawable(getResources().getDrawable(
R.drawable.page_indicator_focused));
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
//点击button后调用,跳转到主界面,勿忘设置参数
public void shipToFrame(View v){
Intent intent = new Intent(this, FrameActivity.class);
startActivity(intent);
this.finish();
}
}
activity_navigation.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/navigation_vp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/viewPoints"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="15dp"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:paddingBottom="150dp"/>
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@mipmap/navigation_image_05">
<LinearLayout
android:id="@+id/introduce_text"
android:layout_width="fill_parent"
android:layout_height="350dp"
android:orientation="vertical"
android:layout_centerInParent="true"
android:layout_marginLeft="80dp"
android:layout_marginRight="80dp"
android:background="#ffffff"
android:alpha="0.8">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="60dp"
android:paddingRight="60dp"
android:paddingTop="100dp"
android:paddingBottom="100dp"
android:text="@string/navigation_page5_text"
android:textSize="30dp"
/>
</LinearLayout>
<Button
android:id="@+id/navigation_btn_enter"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:layout_below="@id/introduce_text"
android:layout_marginTop="50dp"
android:layout_marginLeft="150dp"
android:layout_marginRight="150dp"
android:background="#ffffff"
android:alpha="0.8"
android:text="点击进入"
android:textSize="30dp"
android:onClick="shipToFrame"
/>
</RelativeLayout>
其它页面的布局类似,不多说
frame.java
package com.example.jc.navitation;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
/**
* Created by jc on 2015/11/21.
*/
public class FrameActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame);
}
}
程序到此就已结束了。
代码备注把主要代码都说明了,有疑惑的或者有建议的可以留言给我。