【Android】ViewPager左右滑动和小圆点使用
2016-12-22 00:00
399 查看
摘要: 在做项目的时候,经常会用到ViewPager的使用,现在的使用方式,结合着ImageView和Fragment的使用时越来越多,那么我就用用一个demo来讲解进本用法,也是算是自己的笔记,供自己以后学习。
前言
ViewPager和ImageView以及Fragment的结合使用,是我们在开发的时候面对复杂一点的界面也能很好的实现,今天以一个demo的形式,记录ViewPager的基本使用法,并配合小圆点显示滑动进度结合使用。
首先我们先看布局如何实现:
其中我们要有ViewPager和小圆点的显示位置,然后根据ViewPager的滚动来控制小圆点的显示。
在Activity中,要有在ViewPager中的各种监听具体的代码分析在代码中都有清晰的注释,那么我们就直接张贴源代码:
ImageViewActivity.java
工具类:
ScreenUtil.java
UiUtils.java
以上就是全部内容,欢迎大家留言关注交流。
转载请注明出处:
【定陶黄公子】
前言
ViewPager和ImageView以及Fragment的结合使用,是我们在开发的时候面对复杂一点的界面也能很好的实现,今天以一个demo的形式,记录ViewPager的基本使用法,并配合小圆点显示滑动进度结合使用。
首先我们先看布局如何实现:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v4.view.ViewPager android:id="@+id/image_viewpager" android:layout_width="match_parent" android:layout_height="300dp" android:background="@drawable/icon_1"/> <RelativeLayout android:id="@+id/rl" android:layout_width="wrap_content" android:layout_height="26dp" android:layout_gravity="bottom" android:background="#6f000000" android:padding="5dp" android:visibility="visible"> <TextView android:id="@+id/pic_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:ellipsize="end" android:lines="1" android:maxEms="17" android:text="海淀区全面部署全国文明城区建设" android:textColor="#FFFFFF" android:textSize="11sp" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="16dp" android:layout_alignParentRight="true" android:gravity="center_vertical"> <LinearLayout android:id="@+id/ll_point_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:orientation="horizontal"> </LinearLayout> <View android:id="@+id/view_new_point" android:layout_width="5dp" android:layout_height="5dp" android:layout_centerVertical="true" android:background="@drawable/icon_dot_entity" /> </RelativeLayout> </RelativeLayout> </FrameLayout> </LinearLayout>
其中我们要有ViewPager和小圆点的显示位置,然后根据ViewPager的滚动来控制小圆点的显示。
在Activity中,要有在ViewPager中的各种监听具体的代码分析在代码中都有清晰的注释,那么我们就直接张贴源代码:
ImageViewActivity.java
/** * @author :huangxianfeng on 2016/12/20. * ImageView和ViewPager的使用结合(要有小圆点知识点) */ public class ImageViewActivity extends AppCompatActivity { private int[] imgeId = {R.drawable.icon_1,R.drawable.icon_2,R.drawable.icon_3}; private String[] imgeName = {"火龙果","山竹","菠萝"}; private ViewPager mViewPager; private RelativeLayout mRl; private TextView mPicTitle; private LinearLayout mLLPointGroup; private View mViewNewPoint; private int currentPosition; private int mPointWidth;//小圆点的宽度 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_imageview); init(); initAction(); } /** * 初始化控件 */ private void init() { mViewPager = (ViewPager)findViewById(R.id.image_viewpager); mRl = (RelativeLayout)findViewById(R.id.rl); mPicTitle = (TextView)findViewById(R.id.pic_title); mLLPointGroup = (LinearLayout)findViewById(R.id.ll_point_group); mViewNewPoint = findViewById(R.id.view_new_point); } /** * 初始化控件的监听事件 */ private void initAction() { /** * 对ViewPager设置监听事件 */ mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { /** * * @param position 当用手指滑动时,如果手指按在页面上不动,position和当前页面index是一致的。 * 如果手指向左拖动(相应页面向右翻动),这时候position大部分时间和当前页面是一致的, * 只有翻页成功的情况下最后一次调用才会变为目标页面。(向右滑动同理) * @param positionOffset 是当前页面滑动比例,如果页面向右翻动,这个值不断变大, * 最后在趋近1的情况后突变为0。如果页面向左翻动,这个值不断变小,最后变为0。 * @param positionOffsetPixels 是当前页面滑动像素,变化情况和positionOffset一致。 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (imgeId != null && imgeId.length > 0) { currentPosition = position % imgeId.length; if (currentPosition != (imgeId.length - 1)) { int len = (int) ((mPointWidth * positionOffset) + currentPosition * mPointWidth); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mViewNewPoint.getLayoutParams(); params.leftMargin = len; mViewNewPoint.setLayoutParams(params); } } } /** * 根据那个图片被选中,然后设置对应的显示的名称内容 * @param position 代表那个图片被选中 */ @Override public void onPageSelected(int position) { if (imgeId != null && imgeId.length > 0) { currentPosition = position % imgeId.length; mPicTitle.setText(imgeName[currentPosition]);//拿到相对于的图片的名字 if (currentPosition == (imgeId.length - 1)) { int len = currentPosition * mPointWidth; RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mViewNewPoint.getLayoutParams(); params.leftMargin = len; mViewNewPoint.setLayoutParams(params); } } } /** * 当用手指滑动翻页时,手指按下去的时候会触发这个方法,state值为1,手指抬起时, * 如果发生了滑动(即使很小),这个值会变为2,然后最后变为0 。总共执行这个方法三次。 * 一种特殊情况是手指按下去以后一点滑动也没有发生,这个时候只会调用这个方法两次,state值分别是1,0 。 * @param state */ @Override public void onPageScrollStateChanged(int state) { } }); initDotLayout(); MyViewPager mYAdapter = new MyViewPager(ImageViewActivity.this,imgeId); mViewPager.setAdapter(mYAdapter); } private void initDotLayout(){ mLLPointGroup.removeAllViews(); for (int i = 0; i < imgeId.length; i++) { View point = new View(ImageViewActivity.this); point.setBackgroundResource(R.drawable.icon_dot_empty); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( ScreenUtil.getInstance().dp2Px(UiUtils.getInstance().getContext(), 6), ScreenUtil.getInstance().dp2Px(UiUtils.getInstance().getContext(), 6)); if (i>0){ params.leftMargin = ScreenUtil.getInstance().dp2Px(UiUtils.getInstance().getContext(), 4); } point.setLayoutParams(params); mLLPointGroup.addView(point); if (imgeId.length !=1){ mLLPointGroup.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mLLPointGroup.getViewTreeObserver().removeGlobalOnLayoutListener(this); mPointWidth = mLLPointGroup.getChildAt(1).getLeft() - mLLPointGroup.getChildAt(0).getLeft(); } }); } } } /** * ViewPager的适配器 */ class MyViewPager extends PagerAdapter{ private LinkedList<ImageView> imageViews = new LinkedList<>(); private Activity mActivity; private int[] mImageId; public MyViewPager(Activity mActivity, int[] mImageId) { this.mActivity = mActivity; this.mImageId = mImageId; } @Override public int getCount() { return mImageId.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { //将此对象存储到集合中 imageViews.add((ImageView)object); container.removeView((ImageView) object); } @Override public Object instantiateItem(ViewGroup container, int position) { // 对ViewPager页号求模取出View列表中要显示的项 currentPosition = position % mImageId.length; ImageView mImageView = null; //进行判断集合数据是否为空,为空时创建新的ImageVIew对象 if (imageViews.size() == 0){ mImageView = new ImageView(mActivity); mImageView.setScaleType(ImageView.ScaleType.FIT_XY); }else{ mImageView = imageViews.remove(0); } //给ImageView对象设置图片 mImageView.setBackgroundResource(mImageId[currentPosition]); container.addView(mImageView); return mImageView; } } }
工具类:
ScreenUtil.java
/** * 自适应屏幕的高度 * @author huangxianfeng * */ public class ScreenUtil { private static ScreenUtil instance; private ScreenUtil(){ } public static ScreenUtil getInstance(){ if (instance == null){ synchronized (ScreenUtil.class){ if (instance == null){ instance = new ScreenUtil(); } } } return instance; } /** * 把图片的比例传值进来,再测量屏幕的宽度,得出高度值 * @param context * @param width * @param height * @return */ @SuppressWarnings("deprecation") public int getHeight(Context context,int width,int height){ WindowManager windowManager= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); int scressWidth = windowManager.getDefaultDisplay().getWidth(); if (width != 0) { return (int) ((height*scressWidth) / (float)width); } return 0; } /** * dp转换成像素 * @param context * @param dp * @return */ public int dp2Px(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } /** * 像素转换成dp * @param context * @param px * @return */ public int px2Dp(Context context, float px) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (px / scale + 0.5f); } }
UiUtils.java
/** * @author :huangxianfeng on 2016/12/21. */ public class UiUtils { private static UiUtils instance; private UiUtils() { } public static UiUtils getInstance() { if (instance == null) { synchronized (UiUtils.class) { if (instance == null) { instance = new UiUtils(); } } } return instance; } /** * 进行获取资源类 * @return */ private Resources getResources() { return App.getContextObject().getResources(); } /** * 进行获取图片的Drawable * @param * @return */ public Drawable getDrawable(int drawableId) { return getResources().getDrawable(drawableId); } public static int getDimen(int id) { return (int) (UiUtils.getInstance().getResources().getDimension(id) + 0.5f); } /** * 进行提供获取Context * * @return */ public Context getContext() { return App.getContextObject(); } /** * 进行获取Handler */ public Handler getHandler() { return App.getHandler(); } // /** // * 进行显示信息 // * // * @param msg // */ // public void showToast(final String msg) { // runOnUiThread(new Runnable() { // @Override // public void run() { // Toast.makeText(MyApplication.getContextObject(), msg, Toast.LENGTH_SHORT).show(); // } // }); // } // // /** // * 进行获取屏幕的宽度 // * // * @return // */ // @SuppressWarnings("deprecation") // public int getDefaultWidth() { // WindowManager windowManager = (WindowManager) UiUtils.getInstance().getContext() // .getSystemService(Context.WINDOW_SERVICE); // return windowManager.getDefaultDisplay().getWidth(); // } // // /** // * 进行获取屏幕的高度 // * // * @return // */ // @SuppressWarnings("deprecation") // public int getDefaultHeight() { // WindowManager windowManager = (WindowManager) UiUtils.getInstance().getContext() // .getSystemService(Context.WINDOW_SERVICE); // return windowManager.getDefaultDisplay().getHeight(); // } // // /** // * 进行获取GET_META_DATA的ApplicationInfo // * @param packageManager // * @param packageName // * @return // */ // private Bundle getAppMetaDataBundle(PackageManager packageManager, // String packageName) { // Bundle bundle = null; // try { // ApplicationInfo ai = packageManager.getApplicationInfo(packageName, // PackageManager.GET_META_DATA); // bundle = ai.metaData; // } catch (PackageManager.NameNotFoundException e) { // e.printStackTrace(); // } // return bundle; // } // // /** // * 进行获取对应的键的值 // * @param key // * @param defValue // * @param packageName // * @return // */ // public String getMetaDataStringApplication(String key, String defValue,String packageName) { // Bundle bundle = getAppMetaDataBundle(UiUtils.getInstance().getContext().getPackageManager(),packageName); // if (bundle != null && bundle.containsKey(key)) { // return bundle.getString(key); // } // return defValue; // } }
以上就是全部内容,欢迎大家留言关注交流。
转载请注明出处:
【定陶黄公子】
相关文章推荐
- Android打造带透明圆弧的ImageView
- Android App开发中ViewPager组件的入门使用教程
- Android编程UI设计之GridView和ImageView的用法
- 基于Android实现随手指移动的ImageView
- Android使用ImageView实现支持手势缩放效果
- Android使用ImageView 制作透明圆弧实例代码
- Android中ImageView用法实例分析
- 使用ViewPager实现高仿launcher左右拖动效果
- Android App中用Handler实现ViewPager页面的自动切换
- Android中使用imageviewswitcher 实现图片切换轮播导航的方法
- ViewPager顶部导航栏联动效果(标题栏条目多)
- Android使用控件ImageView加载图片的方法
- Android应用中使用ViewPager实现类似QQ的界面切换效果
- Android中ViewPager组件的基本用法及实现图片切换的示例
- 灵活使用Android中ActionBar和ViewPager切换页面
- Android开发之使用ViewPager实现图片左右滑动切换效果
- Android实现千变万化的ViewPager切换动画
- Android基于ViewPager实现的应用欢迎界面完整实例
- Android 中 TabHost与ViewPager结合实现首页导航效果
- Android ImageView随手势变化动态缩放图片