知识点:
ViewPager
Button-Selector
getViewTreeObserver视图树
在splash闪屏动画结束之后,进入手机新手引导页,效果图;
一共有三张图,前两张相同,第三张有一个开始体验按钮。
布局分析:
使用Relativelayout进行总体布局,三张图片使用ViewPager进行布局,并添加一个按钮,在前两页进行隐藏,在第三页进行显示。
下面三个小灰点儿使用Linerlayout进行线性布局,并将LinerLayout嵌套在一个RelativeLayout中,使小红点压在小灰点儿上。
最后根据检测ViewPager滑动事件来进行操作小红点的位置。
整体XML文件:
<?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/vp_guide" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="25dp" android:background="@drawable/btn_guide_selector" android:textColor="@drawable/text_guide_selector" android:padding="5dp" android:visibility="invisible" android:text="开始体验" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:layout_marginBottom="10dp" > <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/view_red_point" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/shape_point_red" /> </RelativeLayout> </RelativeLayout>
1 数据初始化:
private static final int[] mImageIds = new int[] { R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3 }; private ViewPager vpguide; private ArrayList<ImageView> mImageViewList; mImageViewList =new ArrayList<ImageView>(); for(int i=0;i<mImageIds.length;i++) { ImageView image = new ImageView(this); image.setBackgroundResource(mImageIds[i]); mImageViewList.add(image); //将图片信息储存在ArrayList中 }
class GuideAdapter extends PagerAdapter{ @Override public int getCount() { // 得到图片的数量 // TODO Auto-generated method stub return mImageIds.length; } @Override public boolean isViewFromObject(View arg0, Object arg1) { //用来比较已存入的图片信息,进而当页面发生变化时,进行图片查找 // TODO Auto-generated method stub return arg0==arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { //把图片放入到container容器中。 container.addView(mImageViewList.get(position)); System.out.println("当前创建图片是: "+position); return mImageViewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { System.out.println("destroy : "+position+" 图片!"); //销毁时,将页面删除掉 container.removeView((View) object); //super.destroyItem(container, position, object); } }
vpguide.setAdapter(new GuideAdapter()); vpguide.setOnPageChangeListener(new GuidePagelistener());
Button在没有被点击时,是白色字体,红色背景。在被点击时,是黑色字体,黄色背景。
由于存在着状态切换,所以使用Selector来实现这个功能。
字体颜色的切换:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:color="@android:color/black"/> <item android:color="@android:color/white"/> </selector>背景的切换:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:drawable="@drawable/button_red_pressed"/> <item android:drawable="@drawable/button_red_normal"/> </selector>
android:background="@drawable/btn_guide_selector" android:textColor="@drawable/text_guide_selector"
先声明LinerLayout布局:
<LinearLayout android:id="@+id/ll_point_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout>
绘制灰色小点儿,并填充到LinerLayout中:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@android:color/darker_gray"/> </shape>
//初始化引导页的小圆点 for(int i=0;i<mImageIds.length;i++) { View point = new View(this); LinearLayout.LayoutParams params= new LinearLayout.LayoutParams(10, 10); if(i>0) { params.leftMargin=10; } point.setLayoutParams(params);//设置圆点的大小 point.setBackgroundResource(R.drawable.shape_point_gray); //将灰色小点儿添加到LinearLayout中 llpointgroup.addView(point);//将圆点添加给线性布局 }
同样的方式绘制一个红色小点儿,并压在第一个灰色小点儿上。实现方式是将LinearLayout嵌套在RelativeLayout上,并根据ViewPager滑动事件来动态挪动小红点的位置,来实现动态效果。
红色小点儿:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="@android:color/holo_red_light" /> </shape>
获得红点id :viewRedPoint=findViewById(R.id.view_red_point);
总体XML:<RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:layout_marginBottom="10dp" > <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/view_red_point" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/shape_point_red" /> </RelativeLayout>
@Override public void onPageScrolled(int arg0, float arg1, int arg2) { //滑动变化 System.out.println("arg0 : "+arg0+" ;arg1 : "+arg1+";arg2 : "+arg2); int len = (int)(mPointWidth*arg1)+mPointWidth*arg0; //获取当前红点的参数 RelativeLayout.LayoutParams layoutparams = (RelativeLayout.LayoutParams)viewRedPoint.getLayoutParams(); layoutparams.leftMargin=len; //设置左边距 viewRedPoint.setLayoutParams(layoutparams);//重新为小圆点设置边距 }
整体GuideActivity:
package com.example.zhihuibj; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.LinearGradient; 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.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.RelativeLayout; public class GuideActivity extends Activity{ private static final int[] mImageIds = new int[] { R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3 }; private ViewPager vpguide; private ArrayList<ImageView> mImageViewList; //使用ArrayList储存图片 private LinearLayout llpointgroup; //引导圆点的父控件 private int mPointWidth;//两个圆点之间的距离 private View viewRedPoint; //小红点 private Button btnstart; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //去掉标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_guide); llpointgroup=(LinearLayout) findViewById(R.id.ll_point_group); vpguide = (ViewPager)findViewById(R.id.vp_guide); //得到ViewPager控件 viewRedPoint=findViewById(R.id.view_red_point); btnstart=(Button)findViewById(R.id.btn_start); //初始化数据 InitViews(); //设置适配器 vpguide.setAdapter(new GuideAdapter()); vpguide.setOnPageChangeListener(new GuidePagelistener()); btnstart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //更新sp,表示已经更新了新手引导页 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); sp.edit().putBoolean("is_user_guide_showed", true).commit(); startActivity(new Intent(GuideActivity.this, MainActivity.class)); finish(); } }); } private void InitViews() { mImageViewList =new ArrayList<ImageView>(); for(int i=0;i<mImageIds.length;i++) { ImageView image = new ImageView(this); image.setBackgroundResource(mImageIds[i]); mImageViewList.add(image); //将图片信息储存在ArrayList中 } //初始化引导页的小圆点 for(int i=0;i<mImageIds.length;i++) { View point = new View(this); LinearLayout.LayoutParams params= new LinearLayout.LayoutParams(10, 10); if(i>0) { params.leftMargin=10; } point.setLayoutParams(params);//设置圆点的大小 point.setBackgroundResource(R.drawable.shape_point_gray); //将灰色小点儿添加到LinearLayout中 llpointgroup.addView(point);//将圆点添加给线性布局 } //获取视图树:目的是获得小圆点的间距 llpointgroup.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { System.out.println("绘图结束!"); llpointgroup.getViewTreeObserver().removeOnGlobalLayoutListener(this);; mPointWidth = llpointgroup.getChildAt(1).getLeft()-llpointgroup.getChildAt(0).getLeft(); System.out.println("width"+mPointWidth+""); } }); } class GuidePagelistener implements OnPageChangeListener{ @Override public void onPageScrollStateChanged(int arg0) { // 状态变化 // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { //滑动变化 System.out.println("arg0 : "+arg0+" ;arg1 : "+arg1+";arg2 : "+arg2); int len = (int)(mPointWidth*arg1)+mPointWidth*arg0; //获取当前红点的参数 RelativeLayout.LayoutParams layoutparams = (RelativeLayout.LayoutParams)viewRedPoint.getLayoutParams(); layoutparams.leftMargin=len; //设置左边距 viewRedPoint.setLayoutParams(layoutparams);//重新为小圆点设置边距 } @Override public void onPageSelected(int arg0) { //选中变化 if(arg0==mImageIds.length-1) { btnstart.setVisibility(View.VISIBLE); } else { btnstart.setVisibility(View.INVISIBLE); } } } class GuideAdapter extends PagerAdapter{ @Override public int getCount() { // 得到图片的数量 // TODO Auto-generated method stub return mImageIds.length; } @Override public boolean isViewFromObject(View arg0, Object arg1) { //用来比较已存入的图片信息,进而当页面发生变化时,进行图片查找 // TODO Auto-generated method stub return arg0==arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { //把图片放入到container容器中。 container.addView(mImageViewList.get(position)); System.out.println("当前创建图片是: "+position); return mImageViewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { System.out.println("destroy : "+position+" 图片!"); //销毁时,将页面删除掉 container.removeView((View) object); //super.destroyItem(container, position, object); } } } /* * 所有的点击变化都可以使用选择器selector进行设定 */