写点什么

Android 打造不一样的新手引导页面(二),Android 程序员的春天

作者:嘟嘟侠客
  • 2021 年 11 月 27 日
  • 本文字数:2991 字

    阅读完需:约 10 分钟

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {


private static final float MIN_SCALE = 0.85f;


private static final float MIN_ALPHA = 0.5f;


public void transformPage(View view, float position) {


int pageWidth = view.getWidth();


int pageHeight = view.getHeight();


if (position < -1) { // [-Infinity,-1)


// This page is way off-screen to the left.


view.setAlpha(0);


} else if (position <= 1) { // [-1,1]


// Modify the default slide transition to shrink the page as well


float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));


float vertMargin = pageHeight * (1 - scaleFactor) / 2;


float horzMargin = pageWidth * (1 - scaleFactor) / 2;


if (position < 0) {


view.setTranslationX(horzMargin - vertMargin / 2);


} else {


view.setTranslationX(-horzMargin + vertMargin / 2);


}


// Scale the page down (between MIN_SCALE and 1)


view.setScaleX(scaleFactor);


view.setScaleY(scaleFactor);


// Fade the page relative to its size.


view.setAlpha(MIN_ALPHA +


(scaleFactor - MIN_SCALE) /


(1 - MIN_SCALE) * (1 - MIN_ALPHA));


} else { // (1,+Infinity]


// This page is way off-screen to the right.


view.setAlpha(0);


}


}


}


运行到上述的代码,效果图如下



从上述效果图可以看到,页面切换的时候,主要是页面大小的 变化,水平移动距离的变化以及透明度的变化,这些也可以从代码中体现回来,我们主要关心[-1,1]的时候就 OK,因为在[-Infinity,-1)和(1,+Infinity]的时候是不可见的。


if (position < -1) { // [-Infinity,-1)


// This page is way off-screen to the left.


page.setAlpha(0);


} else if (position <= 1) { // [-1,1]


// Modify the default slide transition to shrink the page as well


float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));


float vertMargin = pageHeight * (1 - scaleFactor) / 2;


float horzMargin = pageWidth * (1 - scaleFactor) / 2;


if (position < 0) {


page.setTranslationX(horzMargin - vertMargin / 2);


} else {


page.setTranslationX(-horzMargin + vertMargin / 2);


}


// Scale the page down (between MIN_SCALE and 1)


page.setScaleX(scaleFactor);


page.setScaleY(scaleFactor);


// Fade the page relative to its size.


page.setAlpha(MIN_ALPHA +


(scaleFactor - MIN_SCALE) /


(1 - MIN_SCALE) * (1 - MIN_ALPHA));


} else { // (1,+Infinity]


// This page is way off-screen to the right.


page.setAlpha(0);


}

DepthPageTransformer

public class DepthPageTransformer implements ViewPager.PageTransformer {


private static final float MIN_SCALE = 0.75f;


public void transformPage(View view, float position) {


int pageWidth = view.getWidth();


if (position < -1) { // [-Infinity,-1)


// This page is way off-screen to the left.


view.setAlpha(0);


} else if (position <= 0) { // [-1,0]


// Use the default slide transition when moving to the left page


view.setAlpha(1);


view.setTranslationX(0);


view.setScaleX(1);


view.setScaleY(1);


} else if (position <= 1) { // (0,1]


// Fade the page out.


view.setAlpha(1 - position);


// Counteract the default slide transition


view.setTranslationX(pageWidth * -position);


// Scale the page down (between MIN_SCALE and 1)


float scaleFactor = MIN_SCALE


  • (1 - MIN_SCALE) * (1 - Math.abs(position));


view.setScaleX(scaleFactor);


view.setScaleY(scaleFactor);


} else { // (1,+Infinity]


// This page is way off-screen to the right.


view.setAlpha(0);


}


}


}


运行上述代码以后,可以看到的变化是





下面来看一下我们自己实现的两个例子





看到上述图以后,仔细分析可以看到在我们滑动的时候主要是旋转角度的 变化,并且 Y 轴旋转中心是页面的中心点,当 position<0 的时候,X 轴的中心是 view.getWidth,当 position>0 的时候,x 轴的中心是 0,代码如下。


public class CubeOutTransformer extends BaseTransformer {


@Override


protected void onTransform(View view, float position) {


view.setPivotX(position < 0f ? view.getWidth() : 0f);


view.setPivotY(view.getHeight() * 0.5f);


view.setRotationY(90f * position);


}


@Override


public boolean isPagingEnabled() {


return true;


}


}

TableTransformer


public class TableTransformer extends BaseTransformer {


private static final Matrix OFFSET_MATRIX = new Matrix();


private static final Camera OFFSET_CAMERA = new Camera();


private static final float[] OFFSET_TEMP_FLOAT = new float[2];


private static final float minScale=0.6f;


@Override


protected void onTransform(View view, float position) {


final float rotation = (position < 0 ? 30f : -30f) * Math.abs(position);


view.setTranslationX(getOffsetXForRotation(rotation, view.getWidth(), view.getHeight()));


view.setPivotX(view.getWidth() * 0.5f);


view.setPivotY(0);


view.setRotationY(rotation);


float scaleX=Math.max(1-Math.abs(position),minScale);


view.setScaleX(scaleX);


}


protected static final float getOffsetXForRotation(float degrees, int width, int height) {


OFFSET_MATRIX.reset();


OFFSET_CAMERA.save();


OFFSET_CAMERA.rotateY(Math.abs(degrees));


OFFSET_CAMERA.getMatrix(OFFSET_MATRIX);


OFFSET_CAMERA.restore();


OFFSET_MATRIX.preTranslate(-width * 0.5f, -height * 0.5f);


OFFSET_MATRIX.postTranslate(width * 0.5f, height * 0.5f);


OFFSET_TEMP_FLOAT[0] = width;


OFFSET_TEMP_FLOAT[1] = height;


OFFSET_MATRIX.mapPoints(OFFSET_TEMP_FLOAT);


return (width - OFFSET_TEMP_FLOAT[0]) * (degrees > 0.0f ? 1.0f : -1.0f);


}


}


到此我们的源码分析为止



面试复习笔记

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的 Android 开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。


《960 页 Android 开发笔记》


![](https://upload-images.ji


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


anshu.io/upload_images/22857658-085a8c4dfa5ced7b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)


《1307 页 Android 开发面试宝典》


包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。



《507 页 Android 开发相关源码解析》


只要是程序员,不管是 Java 还是 Android,如果不去阅读源码,只看 API 文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。


真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。



本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
Android打造不一样的新手引导页面(二),Android程序员的春天