APP引导页的实现

画了好久布局,终于让我写一个引导页的功能。难度不大,同样是记录下来,方便复习。

首先是布局文件,用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>
代码不难,主要方法都有注释,就这样了。




驾驶员睡意检测app策划书 一、项目背景: 随着交通工具的普及和社会的发展,驾驶员的安全问题日益引起人们的重视。据统计,驾驶员疲劳驾驶是导致交通事故的主要原因之一。因此,开发一款用于检测驾驶员睡意的手机app具有重要的意义。 二、项目目标: 1. 开发一款可靠、准确地检测驾驶员疲劳驾驶的app; 2. 提供实时的提醒和警示,帮助驾驶员及时采取安全措施; 3. 提供科学合理的驾驶休息计划和建议,预防及减少疲劳驾驶现象。 4. 提供统计分析功能,为交通管理部门提供更全面的数据支持。 三、功能和特点: 1. 睡意检测:通过驾驶员的手机摄像头和人脸识别技术,实时监测驾驶员的眼睛活动和脸部表情,判断是否出现疲劳驾驶的迹象。 2. 提醒和警示:一旦检测到驾驶员出现疲劳驾驶的迹象,app会立刻发出声音或振动提醒驾驶员,引导其采取相应的安全措施。 3. 驾驶休息计划:根据驾驶员的行驶时间、路况等因素,生成个性化的驾驶休息计划和建议,帮助驾驶员科学合理地安排休息时间。 4. 数据统计和分析:记录驾驶员的驾驶时间、疲劳驾驶次数、休息时长等数据,以报表形式呈现,为交通管理部门提供参考依据,进一步加强交通安全管理。 四、实施计划: 1. 前期准备:调研市场需求和竞争情况,确定开发方向和技术要求。 2. 开发阶段:设计app的功能与界面,进行编码和测试。 3. 测试阶段:邀请志愿者参与测试,收集反馈并不断优化改进。 4. 上线发布:在应用商店上线发布该app,并进行宣传推广。 5. 后期维护:持续收集用户反馈,修复bug,更新版本,增加新功能。 五、市场前景: 随着人们对驾驶安全的关注和科技的发展,驾驶员睡意检测app具有广阔的市场前景。不仅可以帮助驾驶员保障自己和他人的生命安全,还可以提供科学的数据支持,为交通管理部门的决策提供参考依据。 六、经济效益: 通过广泛的用户群体和用户付费计划,该app能够实现更广泛的盈利模式。同时,与交通管理部门的合作,可以进一步拓宽收益渠道。同时,通过进一步的版本升级和功能拓展,也可以持续增加用户黏性和市场竞争力。 总结: 驾驶员睡意检测app是一款基于人脸识别和监测技术的交通安全应用,旨在帮助驾驶员预防和减少疲劳驾驶现象,保障交通出行的安全。通过科学的策划和实施计划,该app将有望在市场上取得良好的反响和经济效益,并为社会公众和交通管理部门带来更加安全和便利的出行体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值