APP引导页的实现
2016-03-26 20:43
330 查看
画了好久布局,终于让我写一个引导页的功能。难度不大,同样是记录下来,方便复习。
首先是布局文件,用viewpager实现的页面滑动。
首先是布局文件,用viewpager实现的页面滑动。
<?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_pages" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="30dip" > <LinearLayout android:id="@+id/ll_guide_points" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> <View android:id="@+id/v_guide_redpoint" android:layout_width="10dip" android:layout_height="10dip" android:background="@drawable/red_point" /> </RelativeLayout> <Button android:id="@+id/bt_guide_startexp" android:background="#ff0000" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="45dip" android:paddingTop="5dip" android:paddingBottom="5dip" android:paddingLeft="10dip" android:paddingRight="10dip" android:textColor="@drawable/btn_colors" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始体验" android:visibility="gone" android:textSize="18sp" /> </RelativeLayout>代码实现
package com.sy.gudiedemo; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.view.ViewTreeObserver; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import java.util.ArrayList; public class MainActivity extends Activity { private ViewPager vp_guids; private LinearLayout ll_points; private View v_redpoint; private Button bt_startExp; private ArrayList<ImageView> guids; private MyAdapter adapter; private int disPoints;//点与点之间的距离 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题 setContentView(R.layout.activity_main); initView();// 初始化界面 initData();// 初始化数据 initEvent();// 初始化组件事件 } private void initEvent() { //监听布局完成 ,触发的结果 v_redpoint.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //取消注册 界面变化而发生的回调结果 v_redpoint.getViewTreeObserver().removeGlobalOnLayoutListener(this); //计算点与点之间的距离 disPoints = (ll_points.getChildAt(1).getLeft() - ll_points.getChildAt(0) .getLeft()); } }); //给按钮添加点击事件 bt_startExp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //保存设置的状态 //进入主界面 //关闭自己 } }); //给ViewPage添加页码改变的事件 vp_guids.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { //当前ViewPager显示的页码 //如果ViewPager滑动到第三个页码(最后一页),显示button if (position == guids.size() - 1) { bt_startExp.setVisibility(View.VISIBLE);//设置设置按钮的显示 } else { //不是最后一页,隐藏该button按钮 bt_startExp.setVisibility(View.GONE); } } /* (non-Javadoc) * @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled(int, float, int) * 在页面滑动过程触发的事件 * @param position 当前ViewPage停留的位置 * @param positionOffset 偏移的比例值 * @param positionOffsetPixels 偏移的像素 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { //positionOffset 移动的比例值 //计算红点的左边距 float leftMargin = disPoints * (position + positionOffset); //设置红点的左边距 RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v_redpoint.getLayoutParams(); layoutParams.leftMargin = Math.round(leftMargin);//对float类型四舍五入 //重新设置布局 v_redpoint.setLayoutParams(layoutParams); } @Override public void onPageScrollStateChanged(int state) { } }); } private void initData() { // viewpaper adapter list // 图片的数据 int[] pics = new int[]{R.mipmap.gudie_1, R.mipmap.gudie_2, R.mipmap.gudie_3}; // 定义Viewpager使用的容器 guids = new ArrayList<ImageView>(); // 初始化容器中的数据 for (int i = 0; i < pics.length; i++) { ImageView iv_temp = new ImageView(getApplicationContext()); iv_temp.setBackgroundResource(pics[i]); // 添加界面的数据 guids.add(iv_temp); // 给点的容器Linearlayout初始化添加灰色点 View v_point = new View(getApplicationContext()); v_point.setBackgroundResource(R.drawable.gray_point); int dip = 10; // 设置灰色点的大小 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dip2px(getApplicationContext(), dip),
<span style="white-space:pre"> </span> dip2px(getApplicationContext(), dip)); // 设置点与点直接的空隙 // 第一个点不需要指定 if (i != 0)// 过滤第一个点 params.leftMargin = 10;// px v_point.setLayoutParams(params);// 无缝隙的挨一起 // 添加灰色的点到线性布局中 ll_points.addView(v_point); } // 界面没有布局前,点的位置是确定不了的,布局完成,再求出点直接的距离 // 创建ViewPager的适配器 adapter = new MyAdapter(guids); // 设置适配器 vp_guids.setAdapter(adapter); } private void initView() { // ViewPage组件 vp_guids = (ViewPager) findViewById(R.id.vp_guide_pages); // 动态加点容器 ll_points = (LinearLayout) findViewById(R.id.ll_guide_points); // 红点 v_redpoint = findViewById(R.id.v_guide_redpoint); // 开始体验的按钮 bt_startExp = (Button) findViewById(R.id.bt_guide_startexp); } /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } }viewpager的适配器
package com.sy.gudiedemo; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.util.ArrayList; import java.util.List; /** * Created by SY on 2016/3/26. */ public class MyAdapter extends PagerAdapter { private List<ImageView> guids; MyAdapter(ArrayList<ImageView> list){ this.guids = list; } @Override public int getCount() { return guids.size();// 返回数据的个数 } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1;// 过滤和缓存的作用 } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object);// 从Viewpager中移除 } @Override public Object instantiateItem(ViewGroup container, int position) { // container viewpaper // 获取View View child = guids.get(position); // 添加View container.addView(child); return child; } }最后是画的小圆点红色和灰色都是一样的
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <corners android:radius="5dip"></corners> <solid android:color="#ff0000"></solid> </shape>代码不难,主要方法都有注释,就这样了。
相关文章推荐
- Android应用界面开发_学习笔记_第四周
- Android开源库
- Android之自定义属性
- objective-C学习笔记(十一)类别和扩展
- 更新iOS和Xcode版本所遇到的问题
- android Studio 使用技巧
- android中MVP模式的小案例(一)
- android中惯用的颜色值
- iOS Couldn't update the Keychain Item问题
- Unity3D热更新<一> 学习Lua
- android系统编译kernel时出错:file not recognized: File truncated
- android表情Gson EditText TextView
- Android RecyclerView 使用完全解析
- 查看Android版本的源代码
- android调用第三方api实现用户数授权登录机制详解
- Android SharePreferences的学习笔记
- QtAndroid具体解释(6):集成信鸽推送
- Hybrid APP介绍
- 多平台响应键盘事件!(适用于Cocos2dx 3.0 alpha以上版本号)
- Dagger2在AndroidStudio中的应用以及MVP