ViewPager实现画廊效果
来源:互联网 发布:python opencv图像识别 编辑:程序博客网 时间:2024/05/21 08:58
1.先看一下效果
2.技术要点:
1、setClipChildren(boolean clipChildren)方法:
clipChild用来定义他的子控件是否要在他应有的边界内进行绘制。 默认情况下,clipChild被设置为true。 也就是不允许进行扩展绘制。而在这个Demo中承载ViewPager的父容器必须要将其设置为false才可以绘制旁边的两页
2、setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer))方法
用于设置ViewPager切换时的动画效果,许多ViewPager切换效果都是通过创建一个类实现ViewPager.PageTransformer然后重写transformPage方法来实现各种切换效果
3.上代码
布局文件:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout android:id="@+id/viewPagerContainer" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:clipChildren="false" android:gravity="center" tools:context="com.lsl.myapplication.MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:layout_centerInParent="true" android:clipChildren="false" > </android.support.v4.view.ViewPager></RelativeLayout>
主要代码
package com.lsl.myapplication;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.RelativeLayout;import com.lsl.myapplication.utils.DeviceUtils;public class MainActivity extends AppCompatActivity { private ViewPager mViewPager; private RelativeLayout mViewPagerContainer; private static int TOTAL_COUNT = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager= (ViewPager) findViewById(R.id.viewpager); mViewPagerContainer= (RelativeLayout) findViewById(R.id.viewPagerContainer); initViewPager(); } private void initViewPager() { //设置ViewPager的布局 RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams( DeviceUtils.getWindowWidth(this)*5/10, DeviceUtils.getWindowHeight(this)*6/10); /**** 重要部分 ******/ //clipChild用来定义他的子控件是否要在他应有的边界内进行绘制。 默认情况下,clipChild被设置为true。 也就是不允许进行扩展绘制。 mViewPager.setClipChildren(false); //父容器一定要设置这个,否则看不出效果 mViewPagerContainer.setClipChildren(false); mViewPager.setLayoutParams(params); //为ViewPager设置PagerAdapter mViewPager.setAdapter(new MyPagerAdapter()); //设置ViewPager切换效果,即实现画廊效果 mViewPager.setPageTransformer(true, new ZoomOutPageTransformer()); //设置预加载数量 mViewPager.setOffscreenPageLimit(2); //设置每页之间的左右间隔 mViewPager.setPageMargin(100); //将容器的触摸事件反馈给ViewPager mViewPagerContainer.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // dispatch the events to the ViewPager, to solve the problem that we can swipe only the middle view. return mViewPager.dispatchTouchEvent(event); } }); } class MyPagerAdapter extends PagerAdapter { @Override public int getCount() { //return viewList==null?0:viewList.size(); return TOTAL_COUNT;//ViewPager里的个数 } @Override public boolean isViewFromObject(View view, Object object) { return (view == object); } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView = new ImageView(MainActivity.this); imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageView.setImageResource(R.mipmap.test); ((ViewPager)container).addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager)container).removeView((ImageView)object); } } public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { @Override public void onPageSelected(int position) { //这里做切换ViewPager时,底部RadioButton的操作 } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (mViewPagerContainer != null) { mViewPagerContainer.invalidate(); } } @Override public void onPageScrollStateChanged(int arg0) { } } /** * 实现的原理是,在当前显示页面放大至原来的MAX_SCALE * 其他页面才是正常的的大小MIN_SCALE */ class ZoomOutPageTransformer implements ViewPager.PageTransformer { private static final float MAX_SCALE = 1.2f; private static final float MIN_SCALE = 1.0f;//0.85f @Override public void transformPage(View view, float position) { //setScaleY只支持api11以上 if (position < -1){ view.setScaleX(MIN_SCALE); view.setScaleY(MIN_SCALE); } else if (position <= 1) //a页滑动至b页 ; a页从 0.0 -1 ;b页从1 ~ 0.0 { // [-1,1]// Log.e("TAG", view + " , " + position + ""); float scaleFactor = MIN_SCALE+(1-Math.abs(position))*(MAX_SCALE-MIN_SCALE); view.setScaleX(scaleFactor); //每次滑动后进行微小的移动目的是为了防止在三星的某些手机上出现两边的页面为显示的情况 if(position>0){ view.setTranslationX(-scaleFactor*2); }else if(position<0){ view.setTranslationX(scaleFactor*2); } view.setScaleY(scaleFactor); } else { // (1,+Infinity] view.setScaleX(MIN_SCALE); view.setScaleY(MIN_SCALE); } } }}
代码里面有一个DeviceUtils类,这个类主要用来获取设备的屏幕尺寸
源码下载
3 0
- ViewPager实现画廊效果
- ViewPager 实现画廊效果
- viewpager实现画廊(一屏多个Fragment)效果
- viewpager实现画廊(一屏多个Fragment)效果
- viewpager实现画廊(一屏多个Fragment)效果
- viewpager实现画廊(一屏多个Fragment)效果
- viewpager实现画廊(一屏多个Fragment)效果
- 基于ViewPager实现Gallery画廊效果
- android使用ViewPager实现画廊效果
- viewpager 实现画廊效果,带动画!
- Android Viewpager实现3D画廊效果
- Android 中使用ViewPager实现画廊效果
- android viewpager实现3d画廊效果
- 【Android】利用ViewPager实现画廊效果
- ViewPager实现简单的画廊效果
- 利用ViewPager实现画廊Gallery效果
- ViewPager+TimerTask实现Gallery画廊效果
- 安卓ViewPager实现画廊效果
- http常见错误码总结
- 自定义View(TopBar)
- HDU 3532 Max Angle(计算几何——极角排序)
- hdu 5791 Two 二维前缀和
- Kotlin开发Android笔记8:Kotlin数据类及json解析
- ViewPager实现画廊效果
- 前端错误集
- D - 放苹果
- 网络编程之TCP
- CodeWars练习之三角数
- 数据结构实验之栈五:下一较大值(一)
- 防止Block循环引用
- Jquery Mobile demo
- 设计类推荐的书籍