android+仿豌豆荚界面,android仿豌豆荚风格的上滑缩放悬停title (缩放主页背景)
【实例简介】
【实例截图】
【核心代码】
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 (缩放主页背景)相关推荐
- boss直聘Android找工作界面,Android仿Boss直聘我的界面滑动效果
最近在找工作,我在使用boss投简历的时候,看到boss的我的界面蛮有意思的,就想如何去实现它,可能是职业病吧,所以就打算仿一下.先看下仿的效果. image 其实我们拿到这个效果的时候,看到滑动,折 ...
- android+qq底部界面,Android 高仿QQ 界面滑动效果
Android高仿QQ界面滑动效果 点击或者滑动切换画面,用ViewPager实现, 首先是布局文件: android:layout_width="match_parent" an ...
- android自定义设置界面,Android开发之精仿QQ设置界面(自定义PreferenceActivity)
Android开发之精仿QQ设置界面(自定义PreferenceActivity) 时间:2011-12-05 10:25:06 来源:Android开发者门户 作者: 今天,再给大家分享一下QQ设置 ...
- android 方向控制界面,Android Studio屏幕方向以及UI界面状态的保存代码详解
项目:orientation package com.example.orientation; import android.os.bundle; import android.util.log; i ...
- android软件欢迎界面,Android应用中实现一个软件启动的欢迎界面
在一个Android应用启动时,可以根据需要为其设置一个欢迎界面.欢迎界面将是用户在启动应用 时看到的第一个界面,传达给用户第一感觉. 下面的几个web,各自提供了一种实现方式. 1.不用线程做And ...
- android studio启动界面,Android Studio 入门:(一) 启动界面
1.实现效果html --2s后--→ java 2.编码思路android (1)建立StartActivity并启动界面的静态布局app ①建立图片资源目录:ide ②导入图片启动 ...
- android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件
Tabhost实现页面滑动切换比较麻烦,这里介绍一下viewPage 控件. 实现了三屏滑动带标题点击和tab页面内按钮的的点击事件实现: viewPage 的优点是可以滑动切换缺点是MainAct ...
- android 实现论坛界面,android界面开发之主流UI布局范例
这篇文章主要说的是android中的UI设定.先看真题效果图,说明.本程序参考新浪微博,图片为猫扑图片. 程序只有最基本的模版,没有任何内容. 点击效果图 这布局为顶部+中间内容+底部模式,现在很多布 ...
- Android 设置按钮在 下滑页面按钮隐藏,上滑页面按钮显示
布局正常布局就可以 // <ImageButtonandroid:id="@+id/btnPostComments"android:layout_width="@d ...
最新文章
- 共轭梯度下降法matlab,用matlab实现最速下降法,牛顿法和共轭梯度法求解实例
- Linux怎么对当前目录提权,linux提权方法(不断总结更新)
- 【spring boot】spring boot @ConditionalOnxxx相关注解总结
- php四种基础排序算法的运行时间比较
- vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确
- php request time,php中time()与$_SERVER[REQUEST_TIME]用法区别分析
- UVA 10891 SUM游戏 DP
- 一键回到页面顶部_微信上线新功能!长期不看的公众号,帮你一键拒收
- 竞价推广的流程有哪些?
- 控制系统--线性定常数系统的传递函数
- WindowsServer2008R2安装中文语言包截图详细教程(附语言包下载资源)
- 台式计算机没有任务栏,电脑任务栏不见了怎么恢复 电脑任务栏怎么设置并排显示...
- mysql 导出 客户端_MySQL 导出数据 导入数据
- pythonarray去除inf_python 中numpy快速去除nan, inf的方法
- 2011刚上市的句子
- 奶油面膜行业调研报告 - 市场现状分析与发展前景预测
- 电脑开机后,显示屏无信号怎么处理?
- 【Python3.7】就餐人数:在为完成练习 9-1 而编写的程序中,添加一个名为 number_served 的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例
- CSS - 语法规则
- 直积与张量积的数学定义与物理定义异同