码迷,mamicode.com
首页 > 其他好文 > 详细

欢迎使用CSDN-markdown编辑器

时间:2015-05-06 17:48:50      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:代码   android   引导页   滑动   

做了一个简单的 引导页 重点其实 是 引导页下面的点随着页面滑动,上图
请参考:http://blog.csdn.net/wanghao200906/article/details/45536761
技术分享

就是 三个点 固定 一个点 滑动 算出来 每个点间隔距离 然后通过 公式算出 滑动多少 小红点 移动多少。其实很简单 下面是核心代码
SmartActivity就是一个 自己定义的 baseactivity
1. 监听布局加载,加载完了 获取并计算两个静态点的距离 。
2.viewpager滑动的监听事件中,第几页+滑动多少 不就晓得动态点位置

“`
package com.example.wang;

import java.util.ArrayList;
import java.util.List;

import com.example.wang.utils.CacheUtils;

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;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.LinearLayout.LayoutParams;

/**
* @author wang
* @version 创建时间:2015年5月6日 上午11:28:46 类说明
*/
public class GuideUI extends SmartActivity implements OnPageChangeListener,
OnClickListener {

// 开始体验按钮
private Button btnStartExperience;
private List<ImageView> imageViewList; // viewpager的数据
private LinearLayout llPointGroup; // 点的组
private View mSelectPointView; // 选中的点view对象
private int basicWidth; // 点之间的宽度

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.guide);

    initView();
}

private void initView() {


    ViewPager mViewPager = getView(R.id.vp_guide);
    btnStartExperience = getView(R.id.btn_guide_start_experience);
    llPointGroup = getView(R.id.ll_guide_point_group);
    mSelectPointView = getView(R.id.select_point);
    initData();

    GuideAdapter mAdapter = new GuideAdapter();
    mViewPager.setAdapter(mAdapter);
    // 滑动监听
    mViewPager.setOnPageChangeListener(this);
    // 按钮监听
    btnStartExperience.setOnClickListener(this);

    // view绘制流程: measure -> layout -> draw
    // 监听mSelectPointView控件layout
    ViewTreeObserver viewTreeObserver = mSelectPointView
            .getViewTreeObserver();
    // 获得视图树的观察者, 监听全部布局的回调
    viewTreeObserver
            .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    // 只执行一次, 把当前的事件从视图树的观察者中移除掉
                    mSelectPointView.getViewTreeObserver()
                            .removeGlobalOnLayoutListener(this);
                    // 取出两个点之间的宽度
                    basicWidth = llPointGroup.getChildAt(1).getLeft()
                            - llPointGroup.getChildAt(0).getLeft();
                    System.out.println("点之间的宽度: " + basicWidth);
                }
            });
}

private void initData() {

    int[] imageResIDs = { R.drawable.a, R.drawable.b,
            R.drawable.c };

    ImageView iv;
    View view;
    LayoutParams params;
    // ctrl + 2 松手停顿 L
    imageViewList = new ArrayList<ImageView>();

    for (int i = 0; i < imageResIDs.length; i++) {
        iv = new ImageView(this);
        iv.setBackgroundResource(imageResIDs[i]);
        // 添加动画
        imageViewList.add(iv);

         // 根据图片的个数, 每循环一次向LinearLayout中添加一个点
        view = new View(this);
        view.setBackgroundResource(R.drawable.point_normal);
        // view的宽高为10
        params = new LayoutParams(20, 20);
        // 让每个点之间有间隙
        if (i != 0) {
            params.leftMargin = 20;
        }

        view.setLayoutParams(params);
        llPointGroup.addView(view);

    }
}

class GuideAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        return imageViewList.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);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView iv = imageViewList.get(position);
        // 1. 向ViewPager中添加一个view对象
        container.addView(iv);

        // 2. 返回当前添加的view对象
        return iv;
    }
}

@Override
public void onClick(View v) {

    // 把 IS_OPEN_MAIN_PAGER 键,再缓存中存储 一个true
    CacheUtils.putBoolean(this, WelcomeUI.is_open_main_pager, true);

    // 打开主页面
    gotoActivity(MainUI.class, true);
}

/**
 * 页面状态改变
 */
@Override
public void onPageScrollStateChanged(int arg0) {
    // TODO Auto-generated method stub

}

/**
 * 页面滚动 position 当前选中的是那个页面 positionOffset 比例 positionOffsetPixels 移动偏移像素
 */
@Override
public void onPageScrolled(int position, float positionOffset,
        int positionOffsetPixels) {
    System.out.println("position: " + position + ", positionOffset: "
            + positionOffset);

    // 20*(1+0.5)=30 移动的距离
    int leftMargin = (int) (basicWidth * (position + positionOffset));

    RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) mSelectPointView
            .getLayoutParams();

    params.leftMargin = leftMargin;
    mSelectPointView.setLayoutParams(params);
}

/**
 * 页面被选中
 */
@Override
public void onPageSelected(int arg0) {

    if (arg0 == imageViewList.size() - 1) {
        btnStartExperience.setVisibility(View.VISIBLE);
    } else {
        btnStartExperience.setVisibility(View.INVISIBLE);
    }
}

}

下载代码

欢迎使用CSDN-markdown编辑器

标签:代码   android   引导页   滑动   

原文地址:http://blog.csdn.net/wanghao200906/article/details/45537713

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!