package com.mikadev.test;
import android.animation.ValueAnimator;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import java.util.ArrayList;
import java.util.List;
public class CustomAnimator extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener {
private final Rect mTmpRect;
private boolean mIsRevert;
private ViewGroup mMainContainer;
private View mFocusedView;
private View mFocusedViewContainer;
private List<View> mFadedOutToBottomViews, mSlideToTop;
private View mStickyTo;
private ViewGroup mEditModeViewGroup;
private int mEditModeHalfHeight;
private final int ANIMATION_DURATION = 300;
public CustomAnimator() {
super();
mTmpRect = new Rect();
mIsRevert = false;
mFadedOutToBottomViews = new ArrayList<View>();
mSlideToTop = new ArrayList<View>();
setInterpolator(new DecelerateInterpolator());
setDuration(ANIMATION_DURATION);
addUpdateListener(this);
}
public void setAnimatorViews(ViewGroup mainContainer, View focusedView, View focusedViewContainer, List<View> fadedOutToBottomViews, View stickyTo, ViewGroup editModeView, List<View> slideToTop) {
if (mainContainer == null) throw new NullPointerException();
if (focusedView == null) throw new NullPointerException();
if (focusedViewContainer == null) throw new NullPointerException();
if (editModeView == null) throw new NullPointerException();
mMainContainer = mainContainer;
mFocusedView = focusedView;
mFocusedViewContainer = focusedViewContainer;
mFadedOutToBottomViews.clear();
if (fadedOutToBottomViews != null)
mFadedOutToBottomViews.addAll(fadedOutToBottomViews);
mStickyTo = stickyTo;
mEditModeViewGroup = editModeView;
mSlideToTop.clear();
if (slideToTop != null)
mSlideToTop.addAll(slideToTop);
removeAllListeners();
addListener(new LayerEnablingAnimatorListener(focusedView));
for (View v : mFadedOutToBottomViews)
addListener(new LayerEnablingAnimatorListener(v));
for (View v : mSlideToTop)
addListener(new LayerEnablingAnimatorListener(v));
addListener(new LayerEnablingAnimatorListener(editModeView));
}
public void setEditModeHalfHeight(int editModeHalfHeight) {
mEditModeHalfHeight = editModeHalfHeight;
}
private Positions getPositionsStart() {
// focusOn
float focusY = mFocusedViewContainer.getY();
// slideToTop
float[] slideToTopY = new float[mSlideToTop.size()];
for (int i = 0; i < mSlideToTop.size(); i++) {
slideToTopY[i] = mSlideToTop.get(i).getY();
}
// fadeToBottom
float[] nextContainersY = new float[mFadedOutToBottomViews.size()];
for (int i = 0; i < mFadedOutToBottomViews.size(); i++) {
nextContainersY[i] = mFadedOutToBottomViews.get(i).getY();
}
float nextContainersAlpha = 1;
// stickyTo
float stickToY = mStickyTo == null ? 0 : mStickyTo.getY();
// fadeInToTop
float editY = mEditModeViewGroup.getY();
float editAlpha = 0f;
return new Positions(focusY, nextContainersY, nextContainersAlpha, stickToY, editY, editAlpha, slideToTopY);
}
private Positions getPositionsEnd() {
// focusOn
mFocusedView.getDrawingRect(mTmpRect);
mMainContainer.offsetDescendantRectToMyCoords(mFocusedView, mTmpRect);
float focusY = mFocusedViewContainer.getY() - mTmpRect.top;
// slideToTop
float[] slideToTopY = new float[mSlideToTop.size()];
for (int i = 0; i < mSlideToTop.size(); i++) {
slideToTopY[i] = mSlideToTop.get(i).getY() - mTmpRect.top;
}
// fadeToBottom
float[] nextContainersY = new float[mFadedOutToBottomViews.size()];
for (int i = 0; i < mFadedOutToBottomViews.size(); i++) {
nextContainersY[i] = mFadedOutToBottomViews.get(i).getY() + mEditModeHalfHeight;
}
float nextContainersAlpha = 0;
// stickyTo
float stickToY = 0;
if (mStickyTo != null) {
mStickyTo.getDrawingRect(mTmpRect);
mMainContainer.offsetDescendantRectToMyCoords(mStickyTo, mTmpRect);
stickToY = mStickyTo.getY() + (mStickyTo.getHeight() - mTmpRect.top);
}
// fadeInToTop
float editY = 0;
float editAlpha = 1f;
return new Positions(focusY, nextContainersY, nextContainersAlpha, stickToY, editY, editAlpha, slideToTopY);
}
public void prepareAnimation() {
mIsRevert = false;
setObjectValues(getPositionsStart(), getPositionsEnd());
setEvaluator(new PositionTypeEvaluator());
}
private Positions getRevertPositionsStart() {
// focusOn
float focusY = mFocusedViewContainer.getY();
// slideToTop
float[] slideToTopY = new float[mSlideToTop.size()];
for (int i = 0; i < mSlideToTop.size(); i++) {
slideToTopY[i] = mSlideToTop.get(i).getY();
}
// fadeToBottom
float[] nextContainersY = new float[mFadedOutToBottomViews.size()];
for (int i = 0; i < mFadedOutToBottomViews.size(); i++) {
nextContainersY[i] = mFadedOutToBottomViews.get(i).getY();
}
float nextContainersAlpha = 0;
// stickyTo
float stickToY = mStickyTo == null ? 0 : mStickyTo.getY();
// fadeInToTop
float editY = mEditModeViewGroup.getY();
float editAlpha = 1f;
return new Positions(focusY, nextContainersY, nextContainersAlpha, stickToY, editY, editAlpha, slideToTopY);
}
private Positions getRevertPositionsEnd() {
// focusOn
mFocusedView.getDrawingRect(mTmpRect);
mMainContainer.offsetDescendantRectToMyCoords(mFocusedView, mTmpRect);
float focusY = mFocusedViewContainer.getY() + mTmpRect.top;
// slideToTop
float[] slideToTopY = new float[mSlideToTop.size()];
for (int i = 0; i < mSlideToTop.size(); i++) {
slideToTopY[i] = mSlideToTop.get(i).getY() + mTmpRect.top;
}
// fadeToBottom
float[] nextContainersY = new float[mFadedOutToBottomViews.size()];
for (int i = 0; i < mFadedOutToBottomViews.size(); i++) {
nextContainersY[i] = mFadedOutToBottomViews.get(i).getY() - mEditModeHalfHeight;
}
float nextContainersAlpha = 1;
// stickyTo
float stickToY = 0;
if (mStickyTo != null) {
mStickyTo.getDrawingRect(mTmpRect);
mMainContainer.offsetDescendantRectToMyCoords(mStickyTo, mTmpRect);
stickToY = mStickyTo.getY() - (mStickyTo.getHeight() - mTmpRect.top);
}
// fadeInToTop
float editY = mEditModeHalfHeight;
float editAlpha = 0f;
return new Positions(focusY, nextContainersY, nextContainersAlpha, stickToY, editY, editAlpha, slideToTopY);
}
public void prepareRevert() {
mIsRevert = true;
setObjectValues(getRevertPositionsStart(), getRevertPositionsEnd());
setEvaluator(new PositionTypeEvaluator());
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Positions currentPos = (Positions) animation.getAnimatedValue();
if (!mIsRevert) {
for (int i = 0; i < mSlideToTop.size(); i++) {
mSlideToTop.get(i).setY(currentPos.getSlideToTop()[i]);
}
mFocusedViewContainer.setY(currentPos.getFocusY());
for (int i = 0; i < mFadedOutToBottomViews.size(); i++) {
mFadedOutToBottomViews.get(i).setY(currentPos.getNextContainersY()[i]);
mFadedOutToBottomViews.get(i).setAlpha(currentPos.getNextContainersAlpha());
}
if (mStickyTo != null)
mStickyTo.setY(currentPos.getStickToY());
mEditModeViewGroup.setY(currentPos.getEditY());
mEditModeViewGroup.setAlpha(currentPos.getEditAlpha());
mEditModeViewGroup.setVisibility(View.VISIBLE);
}
else {
mEditModeViewGroup.setY(currentPos.getEditY());
mEditModeViewGroup.setAlpha(currentPos.getEditAlpha());
if (mStickyTo != null)
mStickyTo.setY(currentPos.getStickToY());
for (int i = 0; i < mFadedOutToBottomViews.size(); i++) {
mFadedOutToBottomViews.get(i).setY(currentPos.getNextContainersY()[i]);
mFadedOutToBottomViews.get(i).setAlpha(currentPos.getNextContainersAlpha());
}
mFocusedViewContainer.setY(currentPos.getFocusY());
for (int i = 0; i < mSlideToTop.size(); i++) {
mSlideToTop.get(i).setY(currentPos.getSlideToTop()[i]);
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
android中选择控件与选择界面自然过度效果的实现
共69个文件
class:30个
png:14个
xml:10个
5星 · 超过95%的资源 需积分: 11 294 下载量 82 浏览量
2014-10-30
22:33:28
上传
评论 4
收藏 268KB RAR 举报
温馨提示
请看:android中选择控件与选择界面自然过度效果的实现--一种新的交互设计 一文 http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1018/1799.html
资源推荐
资源详情
资源评论
收起资源包目录
custom-animations-with-fragment.git.rar (69个子文件)
custom-animations-with-fragment.git
bin
classes.dex 26KB
res
crunch
drawable-hdpi
ic_launcher.png 9KB
drawable-xhdpi
btn_green_normal.9.png 310B
ic_launcher.png 14KB
ic_search_outward.png 529B
ic_search_inward.png 512B
drawable-xxhdpi
ic_launcher.png 18KB
drawable-mdpi
ic_launcher.png 5KB
MainWithoutAnimatorActivity.apk 69KB
dexedLibs
classes
com
mikadev
test
BuildConfig.class 341B
R$layout.class 439B
R$id.class 1KB
R$drawable.class 611B
FormAnimatorDemoActivity$5.class 2KB
PositionTypeEvaluator.class 2KB
CustomAnimator.class 7KB
MainWithAnimatorActivity$2.class 2KB
MainWithAnimatorActivity.class 5KB
MainWithAnimatorActivity$1.class 2KB
R$dimen.class 462B
FormAnimatorDemoActivity$3.class 2KB
FormAnimatorDemoActivity.class 5KB
R$attr.class 334B
R$menu.class 389B
MainWithAnimatorActivity$4.class 2KB
FormAnimatorDemoActivity$1.class 2KB
MainWithAnimatorActivity$3.class 2KB
R.class 653B
Positions.class 1KB
MainWithoutAnimatorActivity$2$1.class 2KB
MainWithoutAnimatorActivity$1.class 2KB
LayerEnablingAnimatorListener.class 1KB
R$string.class 392B
FormAnimatorDemoActivity$6.class 2KB
MainWithoutAnimatorActivity.class 7KB
FormAnimatorDemoActivity$4.class 2KB
FormAnimatorDemoActivity$2.class 2KB
R$style.class 389B
MainWithoutAnimatorActivity$2.class 2KB
resources.ap_ 56KB
AndroidManifest.xml 1KB
res
drawable-ldpi
menu
action_mode.xml 338B
drawable-hdpi
ic_launcher.png 9KB
drawable-xhdpi
btn_green_normal.9.png 214B
ic_launcher.png 14KB
ic_search_outward.png 529B
ic_search_inward.png 512B
drawable
divider_section_bottom.xml 212B
divider_section_top.xml 212B
drawable-xxhdpi
ic_launcher.png 19KB
values
strings.xml 110B
styles.xml 197B
dimens.xml 156B
drawable-mdpi
ic_launcher.png 5KB
layout
fragment_test.xml 6KB
form_animator_demo.xml 10KB
assets
gen
com
mikadev
test
BuildConfig.java 158B
R.java 3KB
.settings
src
com
mikadev
test
MainWithoutAnimatorActivity.java 6KB
LayerEnablingAnimatorListener.java 867B
MainWithAnimatorActivity.java 5KB
FormAnimatorDemoActivity.java 6KB
CustomAnimator.java 8KB
PositionTypeEvaluator.java 2KB
Positions.java 1KB
.project 863B
.classpath 475B
project.properties 563B
AndroidManifest.xml 1KB
共 69 条
- 1
jianghejie123
- 粉丝: 115
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页