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 ...
随机推荐
- 与引导文件系统/vmfs/devices..的备用设备之间的连接已丢失,主机配置更改将不会保存到持久存储中
Cisco UCS 刀片服务器与NETAPP存储 1.异常问题描述: 2.可能原因:存储链路异常 比如断电恢复.光纤线本身的问题.模块的问题.环境温度的问题.bug之类的都有可能 3.处理: ...
- 通过jquery 获取用户当前所在的城市名称和IP地址
下面这段JS代码是通过jquery 结合新浪IP地址库和QQip地址库接口获取用户当前所在的城市(省份)名称. 用户当前IP地址等数据.其中当前IP是通过 QQip地址库接口获取,其他数据都是通过 新 ...
- php 处理上百万条的数据库如何提高处理查询速度
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Sql Server数据库之事务,视图,索引
一.事务的定义 事务是一种机制,包含一组操作指令,并将所有的命令作为一个整体一起向系统提交或撤销操作请求(要么都执行,要么都不执行) 二.事务的分类 显式事务:用Begin TRANSCATION开始 ...
- xadmin增加用户 除了账号和密码 添加其他信息
默认xadmin在添加账号的时候只有账号和密码 我们可以添加其他信息 打开源码 xadmin -> plugins -> auth -> 找到self.form = UserCrea ...
- 二叉搜索树与双向链表(python)
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. # -*- coding:utf-8 -*- # class TreeNo ...
- 解决find命令报错: paths must precede expression
eg: find . -name *.c -or -name *.cpp 需要将模糊搜索词用引号括起来: find . -name "*.c" -or -name "*. ...
- Lozad.js 简单使用
GayHub位置:https://github.com/ApoorvSaxena/lozad.js 导入: <script type="text/javascript" sr ...
- Springboot学习05-自定义错误页面完整分析
Springboot学习06-自定义错误页面完整分析 前言 接着上一篇博客,继续分析Springboot错误页面问题 正文 1-自定义浏览器错误页面(只要将自己的错误页面放在指定的路径下即可) 1-1 ...
- vue的条件渲染和列表渲染介绍
一.条件渲染 1.v-if语句 <div v-if="seen">hahahah</div> <!-- v-if插入或者删除元素的指令 --> ...