之前学习时学习了ViewPager打造3d画廊,今天找出来把他贴上去,给需要的小伙伴用!废话不多说直接贴!

一、Activity

/*** 3da 画廊*/
public class Main3Activity extends AppCompatActivity {private int[] imgResourceArray = new int[]{R.mipmap.three_d_gallery1, R.mipmap.three_d_gallery2,R.mipmap.three_d_gallery3, R.mipmap.three_d_gallery4};private ArrayList<ImageView> imageViewArrayList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);initData();initView();}private void initData() {for (int i = 0; i < imgResourceArray.length; i++) {ImageView imageView = new ImageView(this);imageView.setScaleType(ImageView.ScaleType.FIT_XY);//3、 为imageview生成的带犹豫倒影的bitmapimageView.setImageBitmap(ImageUtil.getReverseBitmapById(imgResourceArray[i], Main3Activity.this));imageViewArrayList.add(imageView);}}private void initView() {final ViewPager viewPager = findViewById(R.id.vp);Adapter adapter = new Adapter();viewPager.setAdapter(adapter);viewPager.setPageTransformer(true, new MyTransformation());//设置当一个页面滑入和滑出的过度特效//2、为解决触摸滑动ViewPager左右两边的页面无反应的问题: 需要为ViewPager的父容器设置OnTouchListener,将触摸事件传递给ViewPagerfindViewById(R.id.all).setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {return viewPager.dispatchTouchEvent(motionEvent);}});}private class Adapter extends PagerAdapter {@Overridepublic int getCount() {return imageViewArrayList.size();}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {return view == object;}@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {container.addView(imageViewArrayList.get(position));return imageViewArrayList.get(position);}@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {container.removeView((View) object);}}
}

二、布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/all"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000"android:clipChildren="false"android:orientation="vertical"tools:context=".study10_17.Main3Activity"><!--1、为解决不在ViewPager中间页面被剪掉的问题:viewPager及其父容器中加入android:clipChildren="false" 必要属性--><android.support.v4.view.ViewPagerandroid:id="@+id/vp"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginBottom="150dp"android:layout_marginLeft="80dp"android:layout_marginRight="80dp"android:layout_marginTop="50dp"android:clipChildren="false" /></LinearLayout>

三、其他工具/控件类

public class ImageUtil {public static Bitmap getReverseBitmapById(int resId, Context context) {//构建出该图片的倒影 并返回构建过倒影的图片Bitmap sourceBitmap = BitmapFactory.decodeResource(context.getResources(), resId);Matrix matrix = new Matrix();matrix.setScale(1, -1);Bitmap inverseBitmap = Bitmap.createBitmap(sourceBitmap, 0, sourceBitmap.getHeight() / 2, sourceBitmap.getWidth(), sourceBitmap.getHeight() / 3, matrix, false);Bitmap groupbBitmap = Bitmap.createBitmap(sourceBitmap.getWidth(), sourceBitmap.getHeight() + sourceBitmap.getHeight() / 3 + 60, sourceBitmap.getConfig());Canvas gCanvas = new Canvas(groupbBitmap);gCanvas.drawBitmap(sourceBitmap, 0, 0, null);gCanvas.drawBitmap(inverseBitmap, 0, sourceBitmap.getHeight() + 15, null);//top中+ number ,number为图片和倒影图片的距离Paint paint = new Paint();Shader.TileMode tileMode = Shader.TileMode.CLAMP;LinearGradient shader = new LinearGradient(0, sourceBitmap.getHeight() + 50, 0,groupbBitmap.getHeight(), Color.BLACK, Color.TRANSPARENT, tileMode);paint.setShader(shader);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));gCanvas.drawRect(0, sourceBitmap.getHeight() + 50, sourceBitmap.getWidth(), groupbBitmap.getHeight(), paint);return groupbBitmap;}
}
public class MyTransformation implements ViewPager.PageTransformer {private static final float MIN_SCALE=0.85f;private static final float MIN_ALPHA=0.5f;private static final float MAX_ROTATE=30;private Camera camera=new Camera();@Overridepublic void transformPage(View page, float position) {float scaleFactor=Math.max(MIN_SCALE,1-Math.abs(position));float rotate=20*Math.abs(position);if (position<-1){}else if (position<0){page.setScaleX(scaleFactor);page.setScaleY(scaleFactor);page.setRotationY(rotate);}else if (position>=0&&position<1){page.setScaleX(scaleFactor);page.setScaleY(scaleFactor);page.setRotationY(-rotate);}else if (position>=1) {page.setScaleX(scaleFactor);page.setScaleY(scaleFactor);page.setRotationY(-rotate);}}
}

有什么疑问的小伙伴可以写在下方,有什么不足欢迎小伙伴的评论,转载请表明出处,谢谢!

android viewPage 打造3d画廊相关推荐

  1. Andrid自定义view:打造3D画廊

    昨日朋友给我看了下这样的效果,我觉得很有意思,今日闲下来便写了这篇文章,并且传到了github,本文的末尾也附上了链接.网上有很多关于使用Gallery来打造3D画廊的博客,但是做出来的效果我不是很满 ...

  2. android3d画廊自动切换,Android实例(一)—— 3D画廊

    3D画廊 之前我都是写的学习的内容,我在写这些教程时遇到有趣的炫酷的小例子也会专门拿出来写一篇文章,今天就写一个酷炫的小例子,叫3D画廊,它是属于ViewPage的进阶版. 下面的指示器是使用的一大神 ...

  3. Unity Android 2021:用C#打造3D ZigZag赛车游戏

    Unity Android 2021 : Build 3D ZigZag Racing Game with C# MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch ...

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

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

  5. Android TV Menu 3D星体旋转效果

    在Android中,如果想要实现3D动画效果一般有两种选择:一是使用Open GL ES,二是使用Camera.Open GL ES使用起来太过复杂,一般是用于比较高级的3D特效或游戏,并且这个也不是 ...

  6. Gallery的基本使用(实现了3D画廊的效果)

    Gallery是一个内部元素可以水平滚动,并且可以把当前选择的子元素定位在它中心的布局组件.下面是一个实现3D画廊的小demo MainActivity.class package com.czh.g ...

  7. Android 自定义控件打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...

  8. android 3d渲染动画效果吗,Android如何实现3D效果

    前言 前段时间读到一篇文章,作者通过自定义View实现了一个高仿小米时钟,其中的3D效果很是吸引我,于是抽时间学习了一下,现在总结出来,和大家分享. 正文 想要在Android上实现3D效果,其实并没 ...

  9. android 滑动翻转动画,Android编程实现3D滑动旋转效果的方法

    本文实例讲述了Android编程实现3D滑动旋转效果的方法.分享给大家供大家参考,具体如下: 这里我们通过代码实现一些滑动翻页的动画效果. Animation实现动画有两个方式:帧动画(frame-b ...

最新文章

  1. Spherical Harmonics Lighting的代码实现(基于OpenGL)
  2. Python--day47--mysql索引注意事项
  3. mysql存储文件用什么类型_块存储、文件存储、对象存储的区别是什么?
  4. 安卓虚拟机启动后报错: 类似 SDK Manager] Error: Error parsing .....devices.xml 解决方案...
  5. 【LeetCode】【数组】题号:*661,图片平滑器
  6. js表单验证(提示版)
  7. JavaScript网页简单特效
  8. stm32f405rgt6芯片手册
  9. SpringBoot快速开始magic-api基础
  10. java的高精度大数字运算的问题
  11. IntelliJ IDEA常用插件介绍和配置
  12. 笃行杂记之Zookeeper SessionTimeOut分析
  13. 利用docker制作Java程序镜像
  14. 电脑网页游戏微端服务器失败,电脑重装后微端游戏玩不了,网页也进不了
  15. CISSP-AIO-快速提示内容梳理
  16. 亿图图示EDraw Max,云的跨端思维导图
  17. 读书笔记--交流电的瞬时值和有效值
  18. jdjjsjsjhfshafhiehf
  19. oracle11g闪退 win7,win7 oracle11g
  20. FPGA:逻辑代数的基本公式和规则

热门文章

  1. 中国脱粒机行业市场供需与战略研究报告
  2. 互联网是怎么形成的?
  3. slay the dragon
  4. android 系统软件名称标注
  5. 6年软件开发工作总结
  6. 案例:逻辑回归预测良恶性乳腺癌肿瘤
  7. 无线路由MAC地址过滤安全可靠性讨论
  8. 反赌科普宣传——赌徒的谬误
  9. 万般皆是命,半点不由人
  10. 高效能人士的七个习惯(史蒂芬·柯维)——读书笔记