下面列出了怎么用android.animation.LayoutTransition的API类实例代码及写法,或者点击链接到github查看源代码。
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void setCardStreamAnimator( CardStreamAnimator animators ){
if( animators == null )
mAnimators = new CardStreamAnimator.EmptyAnimator();
else
mAnimators = animators;
LayoutTransition layoutTransition = getLayoutTransition();
if( layoutTransition != null ){
layoutTransition.setAnimator( LayoutTransition.APPEARING,
mAnimators.getAppearingAnimator(getContext()) );
layoutTransition.setAnimator( LayoutTransition.DISAPPEARING,
mAnimators.getDisappearingAnimator(getContext()) );
}
}
private void doLayoutAnimator() {
LayoutTransition layoutTransition = new LayoutTransition();
layoutTransition.setAnimator(LayoutTransition.APPEARING, getObjectAnimator(false));
layoutTransition.setAnimator(LayoutTransition.DISAPPEARING, getObjectAnimator(true));
layoutTransition.setDuration(2000);
//mPuppet's parentView
ViewGroup contentView = (ViewGroup) ((ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0);
contentView.setLayoutTransition(layoutTransition);
if (contentView.findViewById(R.id.view_puppet) == null) {
contentView.addView(mPuppet);
} else {
contentView.removeView(mPuppet);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void setCardStreamAnimator( CardStreamAnimator animators ){
if( animators == null )
mAnimators = new CardStreamAnimator.EmptyAnimator();
else
mAnimators = animators;
LayoutTransition layoutTransition = getLayoutTransition();
if( layoutTransition != null ){
layoutTransition.setAnimator( LayoutTransition.APPEARING,
mAnimators.getAppearingAnimator(getContext()) );
layoutTransition.setAnimator( LayoutTransition.DISAPPEARING,
mAnimators.getDisappearingAnimator(getContext()) );
}
}
private LayoutTransition createTransitionChange() {
LayoutTransition mTransitioner = new LayoutTransition();
//入场动画:view在这个容器中消失时触发的动画
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 0f, 360f, 0f);
mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
//出场动画:view显示时的动画
ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotation", 0f, 90f, 0f);
mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 100, 0);
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 0);
PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0, 0);
PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom", 0, 0);
Animator changeAppearAnimator = ObjectAnimator.ofPropertyValuesHolder(layoutTransitionGroup,
pvhLeft, pvhTop, pvhRight, pvhBottom);
mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAppearAnimator);
/*
1, LayoutTransition.CHANGE_APPEARING/CHANGE_DISAPPEARING 必须配合PropertyValuesHolder使用才能有效果(使用ObjectAnimator无效).
*/
return mTransitioner;
}
private void initView(Context context) {
if (mIndicatorType == 0) {
for (int i = 0; i < mPinLength; i++) {
View dot = new View(context);
emptyDot(dot);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mDotDiameter,
mDotDiameter);
params.setMargins(mDotSpacing, 0, mDotSpacing, 0);
dot.setLayoutParams(params);
addView(dot);
}
} else if (mIndicatorType == 2) {
LayoutTransition layoutTransition = new LayoutTransition();
layoutTransition.setDuration(DEFAULT_ANIMATION_DURATION);
layoutTransition.setStartDelay(layoutTransition.APPEARING, 0);
setLayoutTransition(layoutTransition);
}
}
/**
* @param giftLayoutParent 存放礼物控件的父容器
* @param giftLayoutNums 礼物控件的数量
* @return
*/
public GiftControl setGiftLayout(LinearLayout giftLayoutParent, @NonNull int giftLayoutNums) {
if (giftLayoutNums <= 0) {
throw new IllegalArgumentException("GiftFrameLayout数量必须大于0");
}
if (giftLayoutParent.getChildCount() > 0) {//如果父容器没有子孩子,就进行添加
return this;
}
mGiftLayoutParent = giftLayoutParent;
mGiftLayoutMaxNums = giftLayoutNums;
LayoutTransition transition = new LayoutTransition();
transition.setAnimator(LayoutTransition.CHANGE_APPEARING,
transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
transition.setAnimator(LayoutTransition.APPEARING,
transition.getAnimator(LayoutTransition.APPEARING));
transition.setAnimator(LayoutTransition.DISAPPEARING,
transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,
transition.getAnimator(LayoutTransition.DISAPPEARING));
mGiftLayoutParent.setLayoutTransition(transition);
return this;
}
private void setupTransition(LayoutTransition transition) {
CheckBox customAnimCB = (CheckBox) findViewById(R.id.customAnimCB);
CheckBox appearingCB = (CheckBox) findViewById(R.id.appearingCB);
CheckBox disappearingCB = (CheckBox) findViewById(R.id.disappearingCB);
CheckBox changingAppearingCB = (CheckBox) findViewById(R.id.changingAppearingCB);
CheckBox changingDisappearingCB = (CheckBox) findViewById(R.id.changingDisappearingCB);
transition.setAnimator(LayoutTransition.APPEARING, appearingCB.isChecked() ?
(customAnimCB.isChecked() ? customAppearingAnim : defaultAppearingAnim) : null);
transition.setAnimator(LayoutTransition.DISAPPEARING, disappearingCB.isChecked() ?
(customAnimCB.isChecked() ? customDisappearingAnim : defaultDisappearingAnim) : null);
transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changingAppearingCB.isChecked() ?
(customAnimCB.isChecked() ? customChangingAppearingAnim :
defaultChangingAppearingAnim) : null);
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,
changingDisappearingCB.isChecked() ?
(customAnimCB.isChecked() ? customChangingDisappearingAnim :
defaultChangingDisappearingAnim) : null);
}
private void setupTransition(LayoutTransition transition) {
CheckBox customAnimCB = (CheckBox) findViewById(R.id.customAnimCB);
CheckBox appearingCB = (CheckBox) findViewById(R.id.appearingCB);
CheckBox disappearingCB = (CheckBox) findViewById(R.id.disappearingCB);
CheckBox changingAppearingCB = (CheckBox) findViewById(R.id.changingAppearingCB);
CheckBox changingDisappearingCB = (CheckBox) findViewById(R.id.changingDisappearingCB);
transition.setAnimator(LayoutTransition.APPEARING, appearingCB.isChecked() ?
(customAnimCB.isChecked() ? customAppearingAnim : defaultAppearingAnim) : null);
transition.setAnimator(LayoutTransition.DISAPPEARING, disappearingCB.isChecked() ?
(customAnimCB.isChecked() ? customDisappearingAnim : defaultDisappearingAnim) : null);
transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changingAppearingCB.isChecked() ?
(customAnimCB.isChecked() ? customChangingAppearingAnim :
defaultChangingAppearingAnim) : null);
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,
changingDisappearingCB.isChecked() ?
(customAnimCB.isChecked() ? customChangingDisappearingAnim :
defaultChangingDisappearingAnim) : null);
}
/***
* This function is used to prepare the layout after the initialize funciton but is called when the developer PROGRAMATICALLY adds
* the accordion from the class. Hence, the accordion does not have the UI elements (children) yet
* @param context
*/
private void prepareLayoutWithoutChildren(Context context) {
initializeViewWithoutChildren(context);
partition.setVisibility(isPartitioned ? VISIBLE : INVISIBLE);
heading.setText(headingString);
paragraph.setVisibility(VISIBLE);
//paragraph.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener);
if (isAnimated) {
headingLayout.setLayoutTransition(new LayoutTransition());
} else {
headingLayout.setLayoutTransition(null);
}
if (isExpanded)
expand();
else
collapse();
setOnClickListenerOnHeading();
}
private void doLayoutAnimator() {
LayoutTransition layoutTransition = new LayoutTransition();
layoutTransition.setAnimator(LayoutTransition.APPEARING, getObjectAnimator(false));
layoutTransition.setAnimator(LayoutTransition.DISAPPEARING, getObjectAnimator(true));
layoutTransition.setDuration(2000);
//mPuppet's parentView
ViewGroup contentView = (ViewGroup) ((ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0);
contentView.setLayoutTransition(layoutTransition);
if (contentView.findViewById(R.id.view_puppet) == null) {
contentView.addView(mPuppet);
} else {
contentView.removeView(mPuppet);
}
}
private void init(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
mFirstModeChange = true;
mContext = context;
if (attrs != null) {
TypedArray types = mContext.obtainStyledAttributes(attrs,
R.styleable.OForm);
mModel = types.getString(R.styleable.OForm_modelName);
mEditable = types.getBoolean(R.styleable.OForm_editableMode,
false);
autoUIGenerate = types.getBoolean(R.styleable.OForm_autoUIGenerate, true);
icon_tint_color = types.getColor(R.styleable.OForm_controlIconTint, -1);
types.recycle();
}
initForm();
LayoutTransition transition = new LayoutTransition();
setLayoutTransition(transition);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void setCardStreamAnimator( CardStreamAnimator animators ){
if( animators == null )
mAnimators = new CardStreamAnimator.EmptyAnimator();
else
mAnimators = animators;
LayoutTransition layoutTransition = getLayoutTransition();
if( layoutTransition != null ){
layoutTransition.setAnimator( LayoutTransition.APPEARING,
mAnimators.getAppearingAnimator(getContext()) );
layoutTransition.setAnimator( LayoutTransition.DISAPPEARING,
mAnimators.getDisappearingAnimator(getContext()) );
}
}
private void prepareLayoutTransition() {
if (isDynamic) {
layoutTransition = new LayoutTransition();
layoutTransition.setStagger(LayoutTransition.APPEARING, 250);
layoutTransition.setAnimateParentHierarchy(false);
}
}
@Override
public void endTransition(LayoutTransition transition, ViewGroup container,
final View view, int transitionType) {
Log.d(TAG, "End LayoutTransition animation:" + transitionType);
if (transitionType == LayoutTransition.APPEARING) {
final View area = view.findViewById(R.id.card_actionarea);
if (area != null) {
runShowActionAreaAnimation(container, area);
}
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
Log.d(TAG, "onLayout: " + changed);
if( changed && !mLayouted ){
mLayouted = true;
ObjectAnimator animator;
LayoutTransition layoutTransition = new LayoutTransition();
animator = mAnimators.getDisappearingAnimator(getContext());
layoutTransition.setAnimator(LayoutTransition.DISAPPEARING, animator);
animator = mAnimators.getAppearingAnimator(getContext());
layoutTransition.setAnimator(LayoutTransition.APPEARING, animator);
layoutTransition.addTransitionListener(mTransitionListener);
if( animator != null )
layoutTransition.setDuration(animator.getDuration());
setLayoutTransition(layoutTransition);
if( mShowInitialAnimation )
runInitialAnimations();
if (mFirstVisibleCardTag != null) {
scrollToCard(mFirstVisibleCardTag);
mFirstVisibleCardTag = null;
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutTransition l = new LayoutTransition();
l.enableTransitionType(LayoutTransition.CHANGING);
viewGroup = (ViewGroup) findViewById(R.id.container);
viewGroup.setLayoutTransition(l);
}
/**
* Attach the bread crumbs to their activity. This must be called once
* when creating the bread crumbs.
*/
public void setActivity(Activity a) {
mActivity = a;
mInflater = (LayoutInflater)a.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mContainer = (LinearLayout)mInflater.inflate(
com.android.internal.R.layout.fragment_bread_crumbs,
this, false);
addView(mContainer);
a.getFragmentManager().addOnBackStackChangedListener(this);
updateCrumbs();
setLayoutTransition(new LayoutTransition());
}
private void init() {
LayoutTransition lt = new LayoutTransition();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
lt.disableTransitionType(LayoutTransition.DISAPPEARING);
}
setLayoutTransition(lt);
setOrientation(HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
}
/**
* 显示搜索按钮
*/
@SuppressLint("ObjectAnimatorBinding")
private void showSearchView() {
if (isFinishing()) {
return;
}
final TipsFloatView tipsFloatView = new TipsFloatView(this);
tipsFloatView.setTag(TAG_SEARCH_VIEW);
tipsFloatView.setClickListener(v -> {
Intent intent = ReflectUtil.getQtalkServiceRNActivityIntent(PbChatActivity.this);
if(intent == null){
return;
}
intent.putExtra("module", "Search");
intent.putExtra("Version", "1.0.0");
intent.putExtra("xmppid", jid);
intent.putExtra("realjid", realJid);
intent.putExtra("chatType", chatType);
intent.putExtra("Screen", "LocalSearch");
startActivity(intent);
clearSearchTip();
});
final LayoutTransition layoutTransition = new LayoutTransition();
layoutTransition.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofFloat(this, "scaleX", 0, 1));
getHandler().postDelayed(() -> {
if(!isFinishing()){
chating_view.setLayoutTransition(layoutTransition);
chating_view.addView(tipsFloatView);
}
}, 500);
}
private void init(Context context) {
this.context = context;
View view = LayoutInflater.from(context).inflate(R.layout.custom_hashtag_layout, this);
ButterKnife.bind(this, view);
(chipsContainer).getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
attachListener();
}
private void disableLayoutTransitions() {
LayoutTransition transition = getLayoutTransition();
transition.disableTransitionType(LayoutTransition.APPEARING);
transition.disableTransitionType(LayoutTransition.DISAPPEARING);
transition.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
transition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
}
@Override
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
// This makes the layout animate when the TextView value changes.
// By default it animates only on hiding./showing views.
// The view must have android:animateLayoutChanges(true) attribute set in the XML.
((ViewGroup) view).getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
}
@Override
public void bind(@Nullable HelpItem helpItem, @NonNull Bundle addition) {
questionText.setText(helpItem.getQuestion());
if (helpItem.getResource() > 0) rawResource = helpItem.getResource();
else answerText.setText(helpItem.getAnswer());
answerLayout.setVisibility(View.GONE);
webView.setVisibility(View.GONE);
LinearLayout container = findViewById(R.id.item_help);
container.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
Log.d(TAG, "onLayout: " + changed);
if( changed && !mLayouted ){
mLayouted = true;
ObjectAnimator animator;
LayoutTransition layoutTransition = new LayoutTransition();
animator = mAnimators.getDisappearingAnimator(getContext());
layoutTransition.setAnimator(LayoutTransition.DISAPPEARING, animator);
animator = mAnimators.getAppearingAnimator(getContext());
layoutTransition.setAnimator(LayoutTransition.APPEARING, animator);
layoutTransition.addTransitionListener(mTransitionListener);
if( animator != null )
layoutTransition.setDuration(animator.getDuration());
setLayoutTransition(layoutTransition);
if( mShowInitialAnimation )
runInitialAnimations();
if (mFirstVisibleCardTag != null) {
scrollToCard(mFirstVisibleCardTag);
mFirstVisibleCardTag = null;
}
}
}
private void setupLayoutTransition() {
// We want to show layout transitions when pages are deleted, to close the gap.
mLayoutTransition = new LayoutTransition();
mLayoutTransition.enableTransitionType(LayoutTransition.DISAPPEARING);
mLayoutTransition.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
mLayoutTransition.disableTransitionType(LayoutTransition.APPEARING);
mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
setLayoutTransition(mLayoutTransition);
}
private void initHorizontalChart() {
horizontalLinearParent = new LinearLayout(context);
horizontalLinearParent.setOrientation(LinearLayout.VERTICAL);
horizontalLinearParent.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
horizontalLinearParent.setGravity(Gravity.LEFT | Gravity.START);
if (isShowAnimation) {
horizontalLinearParent.setLayoutTransition(new LayoutTransition());
}
this.addView(horizontalLinearParent);
}
private void initVerticalChart() {
verticalLinearParent = new LinearLayout(context);
verticalLinearParent.setOrientation(LinearLayout.HORIZONTAL);
verticalLinearParent.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
verticalLinearParent.setGravity(Gravity.BOTTOM);
if (isShowAnimation) {
verticalLinearParent.setLayoutTransition(new LayoutTransition());
}
this.addView(verticalLinearParent);
}
private LayoutTransition createTransition() {
LayoutTransition mTransitioner = new LayoutTransition();
//入场动画:view在这个容器中消失时触发的动画
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 0f, 360f, 0f);
mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
//出场动画:view显示时的动画
ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotation", 0f, 90f, 0f);
mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
return mTransitioner;
}
/**
* Set if animation should be enabled
*
* @param shouldAnimate If animation should be enabled
*/
public void setAnimationEnabled(boolean shouldAnimate) {
mAnimationEnabled = shouldAnimate;
if (shouldAnimate) {
mRightContainer.setLayoutTransition(new LayoutTransition());
} else {
mRightContainer.setLayoutTransition(null);
}
}
public WeatherChartView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.setOrientation(VERTICAL);
transition.enableTransitionType(LayoutTransition.APPEARING);
this.setLayoutTransition(transition);
rowParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
cellParams = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
chartParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}