最开始项目需要使用3D画廊效果作为首页轮播,网上找了半天也没有比较满意的,最终决定自己写一个。本控件采用的是viewpager完成的,支持无限滑动的3D视觉的画廊效果、 平面普通广告栏轮播。提供对外方法:指示器图片自定义、小图片位置、是否圆角等。本代码已托管到[github]https://github.com/lzjin/ViewPagerGallery

1、先看效果图:

gif1.gif

gif2.gif

ic_banner3.png

ic_banner1.png

ic_banner2.png

2、效果分析 3D画廊效果

代码调用:

mViewPager.initBanner(imagesUriList, true)//图片地址,isGallery参数是否开启3D画廊效果

.addPageMargin(10, 50)//参数1page之间的间距,参数2中间item距离边界的间距

.addPoint(6)//添加指示器

.addPointBottom(7)

.addStartTimer(5)//自动轮播5秒间隔

.addRoundCorners(12)//圆角

.finishConfig()//这句必须加

.addBannerListener(new BannerViewPager.OnClickBannerListener() {

@Override

public void onBannerClick(int position) {

//点击item

}

});

代码分析:

3D画廊效果,是通过滑动的属性动画来设置。那我们就得就得了解ViewPager的PageTransformer类。重写PageTransformer,在滑动的时候进行X轴、Y轴的缩放拉伸来实现。

(1)(-oo,-1) 相对于左边第一页,其左边的所有页面

if (position < -1) {

view.setScaleX(MIN_SCALE);

view.setScaleY(MIN_SCALE);

view.setAlpha(MIN_ALPHA);//这里是设置透明度

}

(2)[-1, 1 )当前页的左右第一页

else if (position < 1) {

float scaleFactor = MIN_SCALE + (1 - Math.abs(position)) * (MAX_SCALE - MIN_SCALE);

//[0, 1 ) 相对于当前选中页,其右边第一页 **

if (position > 0) {

view.setTranslationX(-scaleFactor);

}

// [-1, 0 ) 相对于当前选中页,其左边的第一页**

else if (position < 0) {

view.setTranslationX(scaleFactor);

}

view.setScaleY(scaleFactor);

view.setScaleX(scaleFactor);

// float alpha = 1f - Math.abs(position) * (1 - );

float alpha = MIN_ALPHA + (1 - MIN_ALPHA) * (1 - Math.abs(position));

view.setAlpha(alpha);//透明度

}

(3)[1,+oo) 相对于右边第一页,其右边的所有页面

// (1,+Infinity]

else {

view.setScaleX(MIN_SCALE);

view.setScaleY(MIN_SCALE);

view.setAlpha(MIN_ALPHA);//透明度

}

(4)为了让界面显示3item数据,设置左右间距,这里要注意以下 android:clipChildren="false" 这句代码的含义,就是不限制View的布局,已达到边界绘制效果。(间距根据自己需要可更改)

android:id="@+id/viewPager"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:clipChildren="false"

android:layout_marginLeft="60dp"

android:layout_marginRight="60dp"/>

(5)圆角设置

由于网络图片加载我用的Glide库,对应的圆角设置重写BitmapTransformation即可。这里不多讲,网上工具类很多。

//自定义圆角

public class CornerTransform extends BitmapTransformation {

private static float radius = 0f;

public CornerTransform(Context context) {

this(context, 4);

}

public CornerTransform(Context context, int dp) {

super(context);

this.radius = Resources.getSystem().getDisplayMetrics().density * dp;

}

@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {

return roundCrop(pool, toTransform);

}

private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {

if (source == null) return null;

Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);

if (result == null) {

result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);

}

Canvas canvas = new Canvas(result);

Paint paint = new Paint();

paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

paint.setAntiAlias(true);

RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());

canvas.drawRoundRect(rectF, radius, radius, paint);

return result;

}

@Override public String getId() {

return getClass().getName() + Math.round(radius);

}

}

3、 普通效果2

跟上面的实现差不多,唯一的区别就是不重写PageTransformer,参数设置false,使用系统默认的滑动效果即可。

mViewPager.initBanner(imagesUriList, false)//图片地址,关闭3D画廊效果

.addPageMargin(10, 50)//参数1page之间的间距,参数2中间item距离边界的间距

.addPoint(5)//添加指示器,5dp

.addPointBottom(7)

.addStartTimer(5)//自动轮播5秒间隔

.addRoundCorners(12)//圆角

.finishConfig()//这句必须加

.addBannerListener(new BannerViewPager.OnClickBannerListener() {

@Override

public void onBannerClick(int position) {

//点击item

}

});

4、 普通效果1

在普通效果2上,少了圆角设置,已经左右间距设置0即可。

mViewPager.initBanner(imagesUriList, false)//图片地址,关闭3D画廊效果

.addPageMargin(0, 0)//无间距

.addPoint(5)//添加指示器,5dp

.addPointBottom(7)

.addStartTimer(5)//自动轮播5秒间隔

.finishConfig()//这句必须加

.addBannerListener(new BannerViewPager.OnClickBannerListener() {

@Override

public void onBannerClick(int position) {

//点击item

}

});

5、 方法讲解

initBanner(List imagesUriList,boolean isGallery)//图片,是否开启3D画廊效果

initBanner(List imagesUriList,boolean isGallery,float alpha)//图片,画廊,alpha透明度

addPoint(int distance) //间距

addPoint(int distance,int piont_press,int piont) //间距、选中小圆点自定义、未选中小圆点自定义

addRoundCorners(int corners)//圆角10dp

addStartTimer()、stopTimer()

addDefaultImg()

//注意:当添加了3D画廊效果时,columnMargin尽量设小。应该本是已经进行了x、y的缩放

addPageMargin(int columnMargin,int rowMargin)//两个Page之间的距离,中间item的对边界的边距

6.结尾

因为是网络图片,请加网络权限。

如果还是有什么不懂,请前往github查看源码。

纯手工写,实属不易,各位看官如果本文对你有帮助,请点个赞吧。

android自动画廊,Android3D画廊效果与自动轮播Banner相关推荐

  1. android 定时换图片,android 视频和图片切换并进行自动轮播

    刚入android没多久,遇到的比较郁闷的问题就是子线程主线程的问题,更改UI界面,本想做一个图片的轮播但是比较简单,然后就试试实现视频跟图片切换播放进行不停的循环播放.也用过不少控件,但是知其然不知 ...

  2. android使用ViewPage实现Grally画廊的卡片式效果

    通过使用ViewPage实现Grally画廊的卡片式效果,简单易懂易实现. 之前一直在github与网上搜索资料,查看了很多比如RecyclerView实现画廊的效果,ViewPage实现画廊的效果, ...

  3. 画廊效果的ViewPager实现(附带无限自动轮播)

    废话不多说,先上效果图 根据效果所示,第一步实现适配器,完成无限循环 首先做数据上的处理 public static class LoopViewPagerAdapter extends PagerA ...

  4. android view显示隐藏动画效果,Android 根据手势顶部View自动展示与隐藏效果

    首先来看一下效果: 大体思路如下: 总体布局用了一个自定义的ViewGroup,里面包了两个View(top View,bottomView) 我在bottomView里放了ViewPager,里面又 ...

  5. 项目1 设计简易灯箱画廊 实训要求: (1)利用超链接和图像标记设计简易灯箱画廊。 (2)给简易灯箱画廊增加背景音乐效果。

    html5 项目1 设计简易灯箱画廊 实训要求: (1)利用超链接和图像标记设计简易灯箱画廊. (2)给简易灯箱画廊增加背景音乐效果.`` 知识点 (1)超链接标记 <a href=" ...

  6. android 自动播放 幻灯片,Android自动播放Banner图片轮播效果

    本文实例为大家分享了Android自动播放Banner图片轮播的具体代码,供大家参考,具体内容如下 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id=&qu ...

  7. 50个Android开发人员必备UI效果源码[转载]

    Android 仿微信之主页面实现篇 Android 仿微信之界面导航篇 Android 高仿QQ 好友分组列表 Android 高仿QQ 界面滑动效果 Android 高仿QQ 登陆界面 Andro ...

  8. 50个Android开发人员必备UI效果源码

    2019独角兽企业重金招聘Python工程师标准>>> Android 仿微信之主页面实现篇 Android 仿微信之界面导航篇 Android 高仿QQ 好友分组列表 Androi ...

  9. 推荐一个比较好用的画廊展示图片(支持无限轮播)的控件ViewPagerGallery

    1.在此我们引用 支持无限滑动的3D视觉的画廊效果. 平面普通广告栏轮播 这个例子中有可以运行的效果,大家可以下载下来先看一下,在我开始使用的时候,发现,想要调整 page item中的间距,比较困难 ...

  10. Android中RatingBar的自定义效果

    Android中RatingBar的自定义效果 有时候android系统提供给我们的ratingbar效果并不达到我们的要求,这个时候就可以自定义自己喜欢的ratingbar. 从上面的效果可以看出, ...

最新文章

  1. stata安装_Stata自带的代码编辑器太丑了,那为何不使用Jupyter Notebook?
  2. Python应用实战-从pandas的角度来对比MySQL,教你如何更快更好的学习sql
  3. nginx后端节点健康检查
  4. C语言关于符号#和##
  5. [机器学习] XGBoost 自定义损失函数-FocalLoss
  6. Python函数积累
  7. Storm消费Kafka异常 - topic其中两个分区达到某个值不进行消费,持续阻塞
  8. Fixed Widget侧边固定跟随小工具插件
  9. Nacos系列:欢迎来到Nacos的世界!
  10. 学习PMBOK对ITTO输入输出的技术工具整理(关系)
  11. Linux Ubuntu下载
  12. 避坑:twilio+python+电话现在不可以使用(大陆)
  13. 你做的网页在哪些浏览器测试过,这些浏览器的内核分别是什么?
  14. day11-random模块-随机
  15. ping unknown host问题怎么解决?
  16. 爬取大众点评评论-字体加密解析!这个网站很难搞出来!
  17. 计算机专业英语名人名言,英语名人名言(中英对照)
  18. HCNP——OSPF路由器的角色
  19. 解决canvas生成base64图片不清晰的问题
  20. 抽取_内插_半带滤波器_多相滤波器

热门文章

  1. Postgresql本地语言环境参数设置(LC_COLLATE,LC_CTYPE)
  2. HI3559A源码包编译及问题解决
  3. 交换机MAC地址学习与转发机制
  4. 基于 软件体系结构(第3版)考试重点和复习指南
  5. Android访问剪贴板权限,Android 12新增剪贴板访问提醒,可调查应用获取位置数据的频率...
  6. 有人给我留言要电源软件,于是就有了这篇软件合集
  7. 检查计算机设备报告书,关于计算机安全检查的自查报告范文
  8. matlabR2016a与solidworks2016联合仿真的经验分享
  9. 网络工程师--网络规划和设计案例分析(4)
  10. 搜索摄像头/录像机IP地址工具是什么