Android 自定义 ViewPager 打造千变万化的图片切换效果

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

package com.example.zhy_jazzyviewpager;

import java.util.HashMap;

import java.util.LinkedHashMap;

import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.util.Log;

import android.view.View;

import com.nineoldandroids.view.ViewHelper;

public class MyJazzyViewPager extends ViewPager

{

private float mTrans;

private float mScale;

/**

  • 最大的缩小比例

*/

private static final float SCALE_MAX = 0.5f;

private static final String TAG = “MyJazzyViewPager”;

/**

  • 保存position与对于的View

*/

private HashMap<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>();

/**

  • 滑动时左边的元素

*/

private View mLeft;

/**

  • 滑动时右边的元素

*/

private View mRight;

public MyJazzyViewPager(Context context, AttributeSet attrs)

{

super(context, attrs);

}

@Override

public void onPageScrolled(int position, float positionOffset,

int positionOffsetPixels)

{

// Log.e(TAG, “position=” + position+“, positionOffset = “+positionOffset+” ,positionOffsetPixels = " + positionOffsetPixels+” , currentPos = " + getCurrentItem());

//滑动特别小的距离时,我们认为没有动,可有可无的判断

float effectOffset = isSmall(positionOffset) ? 0 : positionOffset;

//获取左边的View

mLeft = findViewFromObject(position);

//获取右边的View

mRight = findViewFromObject(position + 1);

// 添加切换动画效果

animateStack(mLeft, mRight, effectOffset, positionOffsetPixels);

super.onPageScrolled(position, positionOffset, positionOffsetPixels);

}

public void setObjectForPosition(View view, int position)

{

mChildrenViews.put(position, view);

}

/**

  • 通过过位置获得对应的View

  • @param position

  • @return

*/

public View findViewFromObject(int position)

{

return mChildrenViews.get(position);

}

private boolean isSmall(float positionOffset)

{

return Math.abs(positionOffset) < 0.0001;

}

protected void animateStack(View left, View right, float effectOffset,

int positionOffsetPixels)

{

if (right != null)

{

/**

  • 缩小比例 如果手指从右到左的滑动(切换到后一个):0.0~1.0,即从一半到最大

  • 如果手指从左到右的滑动(切换到前一个):1.0~0,即从最大到一半

*/

mScale = (1 - SCALE_MAX) * effectOffset + SCALE_MAX;

/**

  • x偏移量: 如果手指从右到左的滑动(切换到后一个):0-720 如果手指从左到右的滑动(切换到前一个):720-0

*/

mTrans = -getWidth() - getPageMargin() + positionOffsetPixels;

ViewHelper.setScaleX(right, mScale);

ViewHelper.setScaleY(right, mScale);

ViewHelper.setTranslationX(right, mTrans);

}

if (left != null)

{

left.bringToFront();

}

}

}

可以看到,核心代码都是onPageScrolled,我们通过findViewFromObject(position); findViewFromObject(position + 1);分别获取了左右两边的View,然后添加动画效果;当前这个例子添加了两个动画,一个是从0.5放大到1.0或者1.0缩小到0.5,没错由我们的positionOffset提供梯度的变化还有个平移的动画:下一页直接移动到当前屏幕(默认是在右边,可以注释这个效果,怎么运行看看),然后不断的通过positionOffsetPixels抵消原来默认移动时的位移,让用户感觉它就在原地放大缩小

好了,这样就实现了你可以随便写自己喜欢的动画效果,比如在默认上面加个淡入淡出或者神马,随便是不是很随意~~

我们的布局文件:

<RelativeLayout 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”

<com.example.zhy_jazzyviewpager.MyJazzyViewPager

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:id=“@+id/id_viewPager” />

4、JazzyViewPager的使用

其实上面的实现就是github上JazzyViewPager的源码,用法不用说了,就是我们的MainActivity,它内置了大概10来种效果,我们可以通过代码或者布局上面设置动画效果~~我们上面的例子效果,它叫做Stack;

使用JazzViewPager的代码:其实基本一样~~最后也会贴上JazzyViewPager的源码的下载

MainActivity

package com.jfeinstein.jazzyviewpager;

import com.jfeinstein.jazzyviewpager.JazzyViewPager.TransitionEffect;

import android.app.Activity;

import android.os.Bundle;

import android.support.v4.view.PagerAdapter;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.ImageView.ScaleType;

public class MainActivity extends Activity

{

protected static final String TAG = “MainActivity”;

private int[] mImgIds;

private JazzyViewPager mViewPager;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mImgIds = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,

R.drawable.d };

mViewPager = (JazzyViewPager) findViewById(R.id.id_viewPager);

//设置切换效果

mViewPager.setTransitionEffect(TransitionEffect.Stack);

mViewPager.setAdapter(new PagerAdapter()

{

@Override

public boolean isViewFromObject(View arg0, Object arg1)

{

return arg0 == arg1;

}

@Override

public void destroyItem(ViewGroup container, int position,

Object object)

{

container.removeView((View) object);

}

@Override

public Object instantiateItem(ViewGroup container, int position)

{

ImageView imageView = new ImageView(MainActivity.this);

imageView.setImageResource(mImgIds[position]);

imageView.setScaleType(ScaleType.CENTER_CROP);

container.addView(imageView);

mViewPager.setObjectForPosition(imageView, position);

return imageView;

}

@Override

public int getCount()

{

return mImgIds.length;

}

});

}

}

与我们的代码唯一区别就是:

//设置切换效果

mViewPager.setTransitionEffect(TransitionEffect.Stack);

它有12中可选的切换效果,其实就是写了12个切换的动画~~~

好了,最后附上一个我比较喜欢的效果:Tablet

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料

Android高级技术大纲

面试资料整理

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

【附】相关架构及资料

[外链图片转存中…(img-Jzli1CTi-1713685132195)]

[外链图片转存中…(img-UBBTAgOP-1713685132195)]

内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-xkxYWG00-1713685132196)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值