1.viewpager
- ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view。
- ViewPager类直接继承了ViewGroup类,所以它是一个容器类,可以在其中添加其他的view类。
- ViewPager类需要一个PagerAdapter适配器类给它提供数据。
- ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v4.view.ViewPagerandroid:id="@+id/vp_guide"android:layout_width="match_parent"android:layout_height="match_parent" /><Buttonandroid: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:background="@drawable/btn_guide_selector"android:padding="5dp"//padding是从内往外撑android:text="开始体验"android:visibility="invisible"android:textColor="@drawable/btn_guide_text_selector" /><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="20dp" ><LinearLayoutandroid:id="@+id/ll_point_group"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ></LinearLayout><Viewandroid:id="@+id/view_red_point"android:layout_width="10dp"android:layout_height="10dp"android:background="@drawable/shape_point_red" /></RelativeLayout></RelativeLayout>
//新建drawable目录,背景状态选择器<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/button_red_pressed" android:state_pressed="true"/><item android:drawable="@drawable/button_red_normal"/></selector>
//文字颜色选择器<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>
//drawable目录下,形状选择器<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval" ><solid android:color="#f00" /></shape><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval" ><solid android:color="@android:color/darker_gray" /></shape>
一个LinearLayout 和 这个LinearLayout里边一个 TextView 的关系 TextView 就算LinearLayout的子视图 child view 。需要注意的是LayoutParams只是ViewGroup的一个内部类这里边这个也就是ViewGroup里边这个LayoutParams类是 base class 基类实际上每个不同的ViewGroup都有自己的LayoutParams子类
//第一个参数为宽的设置,第二个参数为高的设置。LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);//调用addView()方法增加一个TextView到线性布局中mLayout.addView(textView, p);//比较简单的一个例子- /**<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Text View"/>*/ 效果一样
/*** 新手引导** @author Kevin**/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 viewRedPoint;// 小红点private Button btnStart;// 开始体验@Overrideprotected 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);viewRedPoint = findViewById(R.id.view_red_point);btnStart = (Button) findViewById(R.id.btn_start);btnStart.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 更新sp, 表示已经展示了新手引导PrefUtils.setBoolean(GuideActivity.this,"is_user_guide_showed", true);// 跳转主页面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]);// 设置引导页背景,注意是ResourcemImageViewList.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);//通过params设置布局的参数,括号里是宽高if (i > 0) {params.leftMargin = 10;// 设置圆点间隔}point.setLayoutParams(params);// 设置圆点的大小llPointGroup.addView(point);// 将圆点添加给线性布局}// 获取视图树, 对layout结束事件进行监听,获取小灰点的距离llPointGroup.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {// 当layout执行结束后回调此方法@Overridepublic void onGlobalLayout() {System.out.println("layout 结束");llPointGroup.getViewTreeObserver().removeGlobalOnLayoutListener(this);mPointWidth = llPointGroup.getChildAt(1).getLeft()- llPointGroup.getChildAt(0).getLeft();System.out.println("圆点距离:" + mPointWidth);}});}/*** ViewPager数据适配器** @author Kevin**/class GuideAdapter extends PagerAdapter {@Overridepublic int getCount() {return mImageIds.length;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {container.addView(mImageViewList.get(position));return mImageViewList.get(position);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}/*** viewpager的滑动监听** @author Kevin**/class GuidePageListener implements OnPageChangeListener {// 滑动事件@Overridepublic 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) viewRedPoint.getLayoutParams();// 获取当前红点的布局参数params.leftMargin = len;// 设置左边距viewRedPoint.setLayoutParams(params);// 重新给小红点设置布局参数}// 某个页面被选中@Overridepublic void onPageSelected(int position) {if (position == mImageIds.length - 1) {// 最后一个页面btnStart.setVisibility(View.VISIBLE);// 显示开始体验的按钮} else {btnStart.setVisibility(View.INVISIBLE);}}// 滑动状态发生变化@Overridepublic void onPageScrollStateChanged(int state) {}}}
public class PrefUtils {public static final String PREF_NAME = "config";public static boolean getBoolean(Context ctx, String key,boolean defaultValue) {SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,Context.MODE_PRIVATE);return sp.getBoolean(key, defaultValue);}public static void setBoolean(Context ctx, String key, boolean value) {SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,Context.MODE_PRIVATE);sp.edit().putBoolean(key, value).commit();}}
/*** 闪屏页*/public class SplashActivity extends Activity {RelativeLayout rlRoot;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_splash);rlRoot = (RelativeLayout) findViewById(R.id.rl_root);startAnim();//LibUtils.doSomething();//rlRoot.setBackgroundResource(R.drawable.newscenter_press);}/*** 开启动画*/private void startAnim() {// 动画集合AnimationSet set = new AnimationSet(false);// 旋转动画RotateAnimation rotate = new RotateAnimation(0, 360,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);rotate.setDuration(1000);// 动画时间rotate.setFillAfter(true);// 保持动画状态// 缩放动画ScaleAnimation scale = new ScaleAnimation(0, 1, 0, 1,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);scale.setDuration(1000);// 动画时间scale.setFillAfter(true);// 保持动画状态// 渐变动画AlphaAnimation alpha = new AlphaAnimation(0, 1);alpha.setDuration(2000);// 动画时间alpha.setFillAfter(true);// 保持动画状态set.addAnimation(rotate);set.addAnimation(scale);set.addAnimation(alpha);// 设置动画监听set.setAnimationListener(new AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationRepeat(Animation animation) {}// 动画执行结束@Overridepublic void onAnimationEnd(Animation animation) {jumpNextPage();}});rlRoot.startAnimation(set);}/*** 跳转下一个页面*/private void jumpNextPage() {// 判断之前有没有显示过新手引导boolean userGuide = PrefUtils.getBoolean(this, "is_user_guide_showed",false);if (!userGuide) {// 跳转到新手引导页startActivity(new Intent(SplashActivity.this, GuideActivity.class));} else {startActivity(new Intent(SplashActivity.this, MainActivity.class));}finish();}}
1.viewpager的更多相关文章
- 踩石行动:ViewPager无限轮播的坑
2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...
- Android ViewPager打造3D画廊
本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 网上有很多关于使用Gallery来打造3D画廊的博客,但是在关于Gallery的官方说法中表明: This cl ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
- TabLayout + ViewPager
一.实现思路 1.在build.gradle中添加依赖,例如: compile 'com.android.support:support-v4:23.4.0'compile 'com.android. ...
- android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)
第三节(2):常用控件之ViewPager.日期时间相关.ListView 一.ViewPager 实例:结合PagerAdapter滑动切换图片 二.日期时间相关:AnalogClock\Dig ...
- 简单的ViewPager了解Scroller类
View滑动是自定义ViewGroup中十分常见的一个功能.Android提供了多种View滑动的方法. layout方法 offsetLeftAndRight()与offsetTopAndBotto ...
- PagerSlidingTabStrip介绍及使用,让ViewPager更绚丽
转载请注明出处http://blog.csdn.net/harryweasley/article/details/42290595,谢谢. 以前一直想着,ViewPager中间的那个横线怎么跟着屏幕的 ...
- 详细分析Android viewpager 无限循环滚动图片
由于最近在忙于项目,就没时间更新博客了,于是趁着周日在房间把最近的在项目中遇到的技术总结下.最近在项目中要做一个在viewpager无限滚动图片的需求,其实百度一下有好多的例子,但是大部分虽然实现了, ...
- 一行代码引入 ViewPager 无限循环 + 页码显示
(出处:http://www.cnblogs.com/linguanh) 前序: 网上的这类 ViewPager 很多,但是很多都不够好,体现在 bug多.对少页面不支持,例如1~2张图片.功能整合不 ...
- 使用ViewPager实现自动轮播
很多APP中都实现了类似引导页的自动轮播,不由得想到昨天的引导页上修改一下代码实现轮播. 其实大体上只需要添加一个线程循环执行就可以了. 项目已同步至:https://github.com/nanch ...
随机推荐
- Linux命令:logout
logout [n] 退出当前shell,给父shell返回状态码n. 参考return.
- mysql数据库中指定值在所有表中所有字段中的替换
MySQL数据库: 指定值在数据库中所有表所有字段值的替换(存储过程): 1.写一个存储过程,查指定数据库中所有的表名: CREATE PROCEDURE init_replace(in orig_s ...
- Beta冲刺——第二天
beat冲刺:第二天 各个成员今日完成的任务 成员 冯晓.马思远 彭辉.王爽 吴琼.郝延婷 今日完成任务 ·管理员功能模块的代码规范与测试 ·网站的前端调整 ·代码规范 ·系统管理模块功能测试 ·博客 ...
- Ansible运维工具
1.Ansible是一款极为灵活的开源工具套件,能够大大简化Unix管理员的自动化配置管理与流程控制方式.可以通过命令行或者GUI来使用Ansible,运行Ansible的服务器这里俗称“管理节点”: ...
- int和string之间的转换
#include<cstring> #include<algorithm> #include<stdio.h> #include<iostream> # ...
- 常用的stm32库函数
//初始化的方式:先定义初始化机构体.再打开时钟使能.在对每一组GPIO口进行初始化. GPIO_InitTypeDef LED_GPIO; RCC_APB2PeriphClockCmd(RCC_AP ...
- Codeforces Round #439 C. The Intriguing Obsession
题意:给你三种不同颜色的点,每种若干(小于5000),在这些点中连线,要求同色的点的最短路大于等于3或者不连通,求有多少种连法. Examples Input 1 1 1 Output 8 Input ...
- json and pickle 序列化
前言 文件只能存储字符串.二进制,若把内存的数据对象存到硬盘 从硬盘里读取数据,里面不止是字符串的类型,因此用到了json and pickle 序列化 json序列化 作用:用于不同语言进行的数 ...
- Page Visibility(网页可见性) API与登录同步引导页实例页面
页面1 HTML代码: <p id="loginInfo"></p> JS代码: (function() { if (typeof pageVis ...
- KBEngine 编译出现 MSB802 无法找到v140的生成工具
我用的vs版本是vs2017professional版本,并未安装所有的工具 在编译kbengine源码时候出现 MSB802 无法找到v140的生成工具错误 修复办法在菜单栏选择 工具--> ...