android引导页下方圆点位置跟随手指移动的实现
来源:互联网 发布:极客学院php百度网盘 编辑:程序博客网 时间:2024/04/28 18:44
思考
要随手指滑动,主页面就需要包含一个viewpager控件,和 一个 包含3~4的小圆点的LinearLayout控件,通常最后一个引导页还有一个Button按钮控件让用户点击进入
为后期方便,引导页下方的小圆点就不在布局文件中固定死了,而是通过在代码中给出的图片数组的长度,去动态的画出相应的圆点数(假设是灰色)
要实现随手指移动,前提需要在原来的灰色小圆点上面在布局一个颜色不同的圆点(假设是蓝色),覆盖之前的灰色圆点;然后动态的改变这个蓝色圆点的位置
如何改变蓝色圆点位置呢?在 viewpager 的 onPageScrolled ( int position,float positionOffset, int positionOffsetPixels)的方法中提供了用户滑动viewpager页面时的位置,百分比,和移动距离,这时我们就可以先计算出两个灰色圆点之间的距离,然后 乘上 移动的 百分比,就算出蓝色小圆点应该偏移的距离了
如何计算两个灰色小圆点之间的距离呢? 前提一定要在LinearLayout布局加载完成后去计算,不然距离始终是0,通过LinearLayout的getChildAt(1).getLeft() - getChildAt(0).getLeft() 就算出两点的距离,将该距离设置成蓝点的左边距就ok啦!
步骤:
- 引导页布局文件
<?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="60dp" android:padding="5dp" android:text="立即进入" android:visibility="invisible"/> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" > <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_blue_point" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/shape_point_blue" /> </RelativeLayout></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; private LinearLayout llPointGroup;// 引导圆点的父控件 private int mPointWidth;// 圆点间的距离 private View viewBluePoint;// 蓝点 private Button btnStart;// 进入 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_guide); vpGuide = (ViewPager) findViewById(R.id.vp_guide); llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group); viewBluePoint = findViewById(R.id.view_blue_point); btnStart = (Button) findViewById(R.id.btn_start); btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(GuideActivity.this, MainActivity.class)); finish(); } }); initViews(); vpGuide.setAdapter(new GuideAdapter()); vpGuide.setOnPageChangeListener(new GuidePageListener()); } /** * 初始化界面 */ private void initViews() { mImageViewList = new ArrayList<ImageView>(); // 初始化引导页的3个页面 for (int i = 0; i < mImageIds.length; i++) { ImageView image = new ImageView(this); image.setBackgroundResource(mImageIds[i]);// 设置引导页背景 mImageViewList.add(image); } // 初始化引导页的灰色圆点 for (int i = 0; i < mImageIds.length; i++) { View point = new View(this); point.setBackgroundResource(R.drawable.shape_point_gray);// 设置引导页默认圆点 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10); if (i > 0) { params.leftMargin = 10;// 设置圆点间隔 } point.setLayoutParams(params);// 设置圆点的大小 llPointGroup.addView(point);// 将圆点添加给线性布局 } // 获取视图树, 对layout结束事件进行监听 llPointGroup.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { // 当layout执行结束后回调此方法 @Override public void onGlobalLayout() { llPointGroup.getViewTreeObserver().removeGlobalOnLayoutListener(this); mPointWidth = llPointGroup.getChildAt(1).getLeft()-llPointGroup.getChildAt(0).getLeft(); System.out.println("圆点距离:" + mPointWidth); } }); } /** * ViewPager数据适配器 * */ class GuideAdapter extends PagerAdapter { @Override public int getCount() { return mImageIds.length; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(mImageViewList.get(position)); return mImageViewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } /** * viewpager的滑动监听 */ class GuidePageListener implements OnPageChangeListener { // 滑动事件 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // System.out.println("当前位置:" + position + ";百分比:" + positionOffset // + ";移动距离:" + positionOffsetPixels); int len = (int) (mPointWidth * positionOffset) + position * mPointWidth; RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewBluePoint.getLayoutParams();// 获取当前蓝点的布局参数 params.leftMargin = len;// 设置左边距 viewBluePoint.setLayoutParams(params);// 重新给蓝点设置布局参数 } // 某个页面被选中 @Override public void onPageSelected(int position) { if (position == mImageIds.length - 1) {// 最后一个页面 btnStart.setVisibility(View.VISIBLE);// 显示立即进入的按钮 } else { btnStart.setVisibility(View.INVISIBLE); } } // 滑动状态发生变化 @Override public void onPageScrollStateChanged(int state) { } }}
1 0
- android引导页下方圆点位置跟随手指移动的实现
- 实现跟随手指移动的小球
- 实现跟随手指移动的小球
- Android---26---跟随手指移动的小球
- android 跟随手指移动的 view
- Android 跟随手指移动的圆
- ViewPager实现引导页,底部圆点跟随移动
- 实现ViewPager新手引导页的指示点跟随移动的效果
- android 控件跟随手指移动
- 跟随手指移动的小球
- Android 实例:通过自定义View组件实现跟随手指移动的小兔子
- Android-通过自定义View组件实现跟随手指移动的ImageView组件
- Android 自定义View控件,实现跟随手指触摸移动的小球
- Android最简单的实现View拖拽跟随手指移动效果
- Android开发——自定义View之实现跟随手指移动的小球
- 自定义圆形View:实现跟随手指移动的小球
- android从零开始-开发自定义View-跟随手指移动的小球
- android View 跟随手指移动的7种方式
- Android的Activity屏幕切换动画(二)-左右滑动深入与实战
- 欢迎使用CSDN-markdown编辑器
- 利用storyboard修改页面跳转样式
- 磨刀不误砍柴功:App开发者必备的运营、原型、UI设计工具整理(★firecat推荐★)
- android studio的中文乱码问题
- android引导页下方圆点位置跟随手指移动的实现
- 关于函数调用涉及到的知识点的归纳
- [转]c++中的类型及运算
- sql: Oracle 11g create table, function,trigger, sequence
- sql: Oracle 11g create table, function,trigger, sequence
- 汇编语言Day_01:汇编中常用的寄存器简单介绍
- 直方图的类型
- ViewConfiguration滑动参数设置类
- 跟着巧虎学唐诗28个视频动画教程