【实例简介】

【实例截图】

【核心代码】

package com.flavienlaurent.notboringactionbar;

import android.animation.Animator;

import android.animation.AnimatorListenerAdapter;

import android.animation.AnimatorSet;

import android.animation.ObjectAnimator;

import android.content.Context;

import android.os.Handler;

import android.util.AttributeSet;

import android.util.Log;

import android.view.View;

import android.view.ViewPropertyAnimator;

import android.widget.FrameLayout;

import android.widget.ImageView;

import java.util.Random;

/**

* Created by f.laurent on 21/11/13.

*/

public class KenBurnsView extends FrameLayout {

private static final String TAG = "KenBurnsView";

private final Handler mHandler;

private int[] mResourceIds;

private ImageView[] mImageViews;

private int mActiveImageIndex = -1;

private final Random random = new Random();

private int mSwapMs = 10000;

private int mFadeInOutMs = 400;

private float maxScaleFactor = 1.5F;

private float minScaleFactor = 1.2F;

private Runnable mSwapImageRunnable = new Runnable() {

@Override

public void run() {

swapImage();

mHandler.postDelayed(mSwapImageRunnable, mSwapMs - mFadeInOutMs*2);

}

};

public KenBurnsView(Context context) {

this(context, null);

}

public KenBurnsView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public KenBurnsView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

mHandler = new Handler();

}

public void setResourceIds(int... resourceIds) {

mResourceIds = resourceIds;

fillImageViews();

}

private void swapImage() {

Log.d(TAG, "swapImage active=" mActiveImageIndex);

if(mActiveImageIndex == -1) {

mActiveImageIndex = 1;

animate(mImageViews[mActiveImageIndex]);

return;

}

int inactiveIndex = mActiveImageIndex;

mActiveImageIndex = (1 mActiveImageIndex) % mImageViews.length;

Log.d(TAG, "new active=" mActiveImageIndex);

final ImageView activeImageView = mImageViews[mActiveImageIndex];

activeImageView.setAlpha(0.0f);

ImageView inactiveImageView = mImageViews[inactiveIndex];

animate(activeImageView);

AnimatorSet animatorSet = new AnimatorSet();

animatorSet.setDuration(mFadeInOutMs);

animatorSet.playTogether(

ObjectAnimator.ofFloat(inactiveImageView, "alpha", 1.0f, 0.0f),

ObjectAnimator.ofFloat(activeImageView, "alpha", 0.0f, 1.0f)

);

animatorSet.start();

}

private void start(View view, long duration, float fromScale, float toScale, float fromTranslationX, float fromTranslationY, float toTranslationX, float toTranslationY) {

view.setScaleX(fromScale);

view.setScaleY(fromScale);

view.setTranslationX(fromTranslationX);

view.setTranslationY(fromTranslationY);

ViewPropertyAnimator propertyAnimator = view.animate().translationX(toTranslationX).translationY(toTranslationY).scaleX(toScale).scaleY(toScale).setDuration(duration);

propertyAnimator.start();

Log.d(TAG, "starting Ken Burns animation " propertyAnimator);

}

private float pickScale() {

return this.minScaleFactor this.random.nextFloat() * (this.maxScaleFactor - this.minScaleFactor);

}

private float pickTranslation(int value, float ratio) {

return value * (ratio - 1.0f) * (this.random.nextFloat() - 0.5f);

}

public void animate(View view) {

float fromScale = pickScale();

float toScale = pickScale();

float fromTranslationX = pickTranslation(view.getWidth(), fromScale);

float fromTranslationY = pickTranslation(view.getHeight(), fromScale);

float toTranslationX = pickTranslation(view.getWidth(), toScale);

float toTranslationY = pickTranslation(view.getHeight(), toScale);

start(view, this.mSwapMs, fromScale, toScale, fromTranslationX, fromTranslationY, toTranslationX, toTranslationY);

}

@Override

protected void onAttachedToWindow() {

super.onAttachedToWindow();

startKenBurnsAnimation();

}

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

mHandler.removeCallbacks(mSwapImageRunnable);

}

private void startKenBurnsAnimation() {

mHandler.post(mSwapImageRunnable);

}

@Override

protected void onFinishInflate() {

super.onFinishInflate();

View view = inflate(getContext(), R.layout.view_kenburns, this);

mImageViews = new ImageView[2];

mImageViews[0] = (ImageView) view.findViewById(R.id.image0);

mImageViews[1] = (ImageView) view.findViewById(R.id.image1);

}

private void fillImageViews() {

for (int i = 0; i < mImageViews.length; i ) {

mImageViews[i].setImageResource(mResourceIds[i]);

}

}

}

android+仿豌豆荚界面,android仿豌豆荚风格的上滑缩放悬停title (缩放主页背景)相关推荐

  1. boss直聘Android找工作界面,Android仿Boss直聘我的界面滑动效果

    最近在找工作,我在使用boss投简历的时候,看到boss的我的界面蛮有意思的,就想如何去实现它,可能是职业病吧,所以就打算仿一下.先看下仿的效果. image 其实我们拿到这个效果的时候,看到滑动,折 ...

  2. android+qq底部界面,Android 高仿QQ 界面滑动效果

    Android高仿QQ界面滑动效果 点击或者滑动切换画面,用ViewPager实现, 首先是布局文件: android:layout_width="match_parent" an ...

  3. android自定义设置界面,Android开发之精仿QQ设置界面(自定义PreferenceActivity)

    Android开发之精仿QQ设置界面(自定义PreferenceActivity) 时间:2011-12-05 10:25:06 来源:Android开发者门户 作者: 今天,再给大家分享一下QQ设置 ...

  4. android 方向控制界面,Android Studio屏幕方向以及UI界面状态的保存代码详解

    项目:orientation package com.example.orientation; import android.os.bundle; import android.util.log; i ...

  5. android软件欢迎界面,Android应用中实现一个软件启动的欢迎界面

    在一个Android应用启动时,可以根据需要为其设置一个欢迎界面.欢迎界面将是用户在启动应用 时看到的第一个界面,传达给用户第一感觉. 下面的几个web,各自提供了一种实现方式. 1.不用线程做And ...

  6. android studio启动界面,Android Studio 入门:(一) 启动界面

    1.实现效果html         --2s后--→ java 2.编码思路android (1)建立StartActivity并启动界面的静态布局app ①建立图片资源目录:ide ②导入图片启动 ...

  7. android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件

    Tabhost实现页面滑动切换比较麻烦,这里介绍一下viewPage 控件. 实现了三屏滑动带标题点击和tab页面内按钮的的点击事件实现: viewPage  的优点是可以滑动切换缺点是MainAct ...

  8. android 实现论坛界面,android界面开发之主流UI布局范例

    这篇文章主要说的是android中的UI设定.先看真题效果图,说明.本程序参考新浪微博,图片为猫扑图片. 程序只有最基本的模版,没有任何内容. 点击效果图 这布局为顶部+中间内容+底部模式,现在很多布 ...

  9. Android 设置按钮在 下滑页面按钮隐藏,上滑页面按钮显示

    布局正常布局就可以 // <ImageButtonandroid:id="@+id/btnPostComments"android:layout_width="@d ...

最新文章

  1. 共轭梯度下降法matlab,用matlab实现最速下降法,牛顿法和共轭梯度法求解实例
  2. Linux怎么对当前目录提权,linux提权方法(不断总结更新)
  3. 【spring boot】spring boot @ConditionalOnxxx相关注解总结
  4. php四种基础排序算法的运行时间比较
  5. vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确
  6. php request time,php中time()与$_SERVER[REQUEST_TIME]用法区别分析
  7. UVA 10891 SUM游戏 DP
  8. 一键回到页面顶部_微信上线新功能!长期不看的公众号,帮你一键拒收
  9. 竞价推广的流程有哪些?
  10. 控制系统--线性定常数系统的传递函数
  11. WindowsServer2008R2安装中文语言包截图详细教程(附语言包下载资源)
  12. 台式计算机没有任务栏,电脑任务栏不见了怎么恢复 电脑任务栏怎么设置并排显示...
  13. mysql 导出 客户端_MySQL 导出数据 导入数据
  14. pythonarray去除inf_python 中numpy快速去除nan, inf的方法
  15. 2011刚上市的句子
  16. 奶油面膜行业调研报告 - 市场现状分析与发展前景预测
  17. 电脑开机后,显示屏无信号怎么处理?
  18. 【Python3.7】就餐人数:在为完成练习 9-1 而编写的程序中,添加一个名为 number_served 的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例
  19. CSS - 语法规则
  20. 直积与张量积的数学定义与物理定义异同

热门文章

  1. 青海西藏新疆地区有名的调查研究咨询公司
  2. 美通企业日报 | 海信发布中国首款社交电视;阿里与VEX将成立高校机器人联盟...
  3. uni-app 使用u-echarts图表插件步骤(圆环)
  4. 使用Java实现文档的下载(Excel,Word文档等)
  5. camtasia studio2022电脑屏幕录像录屏剪辑
  6. HDMI-PS端DDR视频缓存调试记录
  7. 马来西亚纳闽岛(Labuan)
  8. <!DOCTYPE html>作用
  9. 字符串全排列与组合算法以及八皇后问题
  10. 3. 链路层(学习笔记)