栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

实现马蜂窝旅游头像泡泡动画,安卓面试项目经验

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实现马蜂窝旅游头像泡泡动画,安卓面试项目经验

if (null != browseEntity) {

roundedImageView.setBackgroundResource(browseEntity.drawableId);

String username = browseEntity.name;

if (!TextUtils.isEmpty(username)) {

textView.setText(username + “来过”);

}

}

}

}

由上面的操作就完成基础显示

3、接下来完成第一阶段动画 由最小缩放到最大

private boolean createAnimView() {

if (!isStop) {

return true;

}

ImageView imageView = getImageView();

//创建好后 设置缩放到最小

imageView.setScaleX(0);

imageView.setScaleY(0);

initData(imageView);

startScaleAnim(imageView);

return false;

}

//执行缩放动画

private void startScaleAnim(final ImageView imageView) {

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);

valueAnimator.setDuration(800);

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

float animatedValue = (float) animation.getAnimatedValue();

imageView.setScaleX(0.1f + animatedValue);

imageView.setScaleY(0.1f + animatedValue);

}

});

valueAnimator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

if (position == browseEntities.size() - 1) {

position = 0;

} else {

position++;

}

BrowseEntity browseEntity = browseEntities.get(position);

//动画执行完后要立马取出下
一个图片 把底部的图片显示更新

tempImageView.setBackgroundResource(browseEntity.drawableId);

//动画执行完执行平移动画

startTranslationAnimator(imageView);

}

});

valueAnimator.start();

}

4.第二阶段的曲线运动缩小动画

private void startTranslationAnimator(final ImageView imageView) {

Path path;

int seed = (int) (Math.random() * 100);

//根据随机数来确定是走左边曲线还是右边曲线

if (seed % 2 == 0) {

//曲线路径的封装

path = createRightPath();

} else {

//曲线路径的封装

path = createLeftPath();

}

//通过PathMeasure 和ValueAnimator结合 在不同的阶段取出运动路径的x,y值

final PathMeasure pathMeasure = new PathMeasure(path, false);

final ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f, 0.0f);

valueAnimator.setDuration(riseDuration);

valueAnimator.setInterpolator(new LinearInterpolator());

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

float animatedValue = (float) animation.getAnimatedValue();

int length = (int) (pathMeasure.getLength() * animatedValue);

//在不同的阶段取出运动路径的x,y值

pathMeasure.getPosTan(length, pos, tan);

imageView.setTranslationX(pos[0]);

imageView.setTranslationY(pos[1]);

//同时做透明度动画

imageView.setAlpha(animatedValue);

if (animatedValue >= 0.5f) {

imageView.setScaleX(0.2f + animatedValue);

imageView.setScaleY(0.2f + animatedValue);

}

}

});

valueAnimator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

//动画执行完就移除View

removeView(imageView);

}

});

valueAnimator.start();

}

5、三阶赛贝尔曲线的计算 下面以左边的为例

这里我也没有更好的办法去计算 是通过不断预估尝试出来的 如果有大佬在这里有很好的计算方法 请务必告知下

private Path createLeftPath() {

Path path = new Path();

float nextFloat = new Random().nextFloat();

path.moveTo(nextFloat, -height * 1.0f / 1.8f);

//曲线控制点一

controlPointOne.x = -(viewWidth);

controlPointOne.y = -height / 5;

//曲线控制点二

controlPointTwo.x = -(viewWidth + marginLeft / 2);

controlPointTwo.y = (int) (-height * 0.15);

//生成三阶贝塞尔曲线

path.cubicTo(controlPointOne.x, controlPointOne.y, controlPointTwo.x, controlPointTwo.y, 0, 0);

return path;

}

最后连贯起来看看效果

6、最后使用RxJava 的timer()操作符 发延迟消息来让整个动画循环执行起来

这里也可以用handler 来发消息处理

public void startAnimation(int innerDelay) {

subscribe = Observable.timer(innerDelay, TimeUnit.MILLISECONDS)

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Consumer() {

@Override

public void accept(Long aLong) throws Exception {

if (createAnimView()) return;

int duration = (int) (1500 * Math.random());

if (duration < 500) {

duration = 500;

}

//循环调用

startAnimation(500 + duration);

}

});

dSchedulers.mainThread())

.subscribe(new Consumer() {

@Override

public void accept(Long aLong) throws Exception {

if (createAnimView()) return;

int duration = (int) (1500 * Math.random());

if (duration < 500) {

duration = 500;

}

//循环调用

startAnimation(500 + duration);

}

});

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708556.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号