aru*_*run 204 java android android-animation
我设计了一个简单的布局.我已经完成了没有动画的设计,但现在我想在textview点击事件时添加动画,我不知道如何使用它.我的xml设计看起来好不好?任何建议,将不胜感激.
我的XML
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:longClickable="false"
android:orientation="vertical"
android:weightSum="16" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:background="#00DDA0"
android:layout_weight="3" >
</LinearLayout>
<TextView
android:id="@+id/Information1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:text="Child Information"
android:background="#0390BE"
android:layout_weight="0.75"
android:textColor="#FFFFFF"
android:layout_gravity="center|fill_horizontal"/>
<LinearLayout
android:id="@+id/layout1"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="8.5"
android:background="#BBBBBB"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView" />
</LinearLayout>
<TextView
android:id="@+id/Information2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="Parent Information"
android:background="#0390BE"
android:layout_weight="0.75"
android:textColor="#FFFFFF"
android:layout_gravity="center|fill_horizontal"/>
<LinearLayout
android:id="@+id/layout2"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:background="#BBBBBB"
android:layout_weight="8.5" >
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView" />
</LinearLayout>
<TextView
android:id="@+id/Information3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="Siblings"
android:background="#0390BE"
android:layout_weight="0.75"
android:textColor="#FFFFFF"
android:layout_gravity="center|fill_horizontal"/>
<LinearLayout
android:id="@+id/layout3"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:background="#BBBBBB"
android:layout_weight="8.5" >
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView" />
</LinearLayout>
<TextView
android:id="@+id/Information4"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="Teacher Information"
android:background="#0390BE"
android:layout_weight="0.75"
android:textColor="#FFFFFF"
android:layout_gravity="center|fill_horizontal"/>
<LinearLayout
android:id="@+id/layout4"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:background="#BBBBBB"
android:layout_weight="8.5" >
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView" />
</LinearLayout>
<TextView
android:id="@+id/Information5"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="Grade Information"
android:background="#0390BE"
android:layout_weight="0.75"
android:textColor="#FFFFFF"
android:layout_gravity="center|fill_horizontal"/>
<LinearLayout
android:id="@+id/layout5"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:background="#BBBBBB"
android:layout_weight="8.5" >
<TextView
android:id="@+id/textView5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView" />
</LinearLayout>
<TextView
android:id="@+id/Information6"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="Health Information"
android:background="#0390BE"
android:layout_weight="0.75"
android:textColor="#FFFFFF"
android:layout_gravity="center|fill_horizontal"/>
<LinearLayout
android:id="@+id/layout6"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:background="#BBBBBB"
android:layout_weight="8.5" >
<TextView
android:id="@+id/textView5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView"
android:layout_weight="8.5" />
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我的java
public class Certify_Info extends Activity {
private static TextView tv2,tv3,tv5,tv6,tv4,tv1;
private static LinearLayout l1,l2,l3,l4,l5,l6;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_certify__info);
tv1=(TextView) findViewById(R.id.Information1);
tv2=(TextView) findViewById(R.id.Information2);
tv3=(TextView) findViewById(R.id.Information3);
tv4=(TextView) findViewById(R.id.Information4);
tv5=(TextView) findViewById(R.id.Information5);
tv6=(TextView) findViewById(R.id.Information6);
l1=(LinearLayout) findViewById(R.id.layout1);
l2=(LinearLayout) findViewById(R.id.layout2);
l3=(LinearLayout) findViewById(R.id.layout3);
l4=(LinearLayout) findViewById(R.id.layout4);
l5=(LinearLayout) findViewById(R.id.layout5);
l6=(LinearLayout) findViewById(R.id.layout6);
l2.setVisibility(View.GONE);
l3.setVisibility(View.GONE);
l4.setVisibility(View.GONE);
l5.setVisibility(View.GONE);
l6.setVisibility(View.GONE);
tv1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
l2.setVisibility(View.GONE);
l3.setVisibility(View.GONE);
l4.setVisibility(View.GONE);
l5.setVisibility(View.GONE);
l6.setVisibility(View.GONE);
l1.setVisibility(View.VISIBLE);
}
});
tv2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
l1.setVisibility(View.GONE);
l3.setVisibility(View.GONE);
l4.setVisibility(View.GONE);
l5.setVisibility(View.GONE);
l6.setVisibility(View.GONE);
l2.setVisibility(View.VISIBLE);
}
});
tv3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
l1.setVisibility(View.GONE);
l2.setVisibility(View.GONE);
l4.setVisibility(View.GONE);
l5.setVisibility(View.GONE);
l6.setVisibility(View.GONE);
l3.setVisibility(View.VISIBLE);
}
});
tv4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
l1.setVisibility(View.GONE);
l2.setVisibility(View.GONE);
l3.setVisibility(View.GONE);
l4.setVisibility(View.GONE);
l5.setVisibility(View.GONE);
l6.setVisibility(View.GONE);
l4.setVisibility(View.VISIBLE);
}
});
tv5.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
l1.setVisibility(View.GONE);
l2.setVisibility(View.GONE);
l3.setVisibility(View.GONE);
l4.setVisibility(View.GONE);
l6.setVisibility(View.GONE);
l5.setVisibility(View.VISIBLE);
}
});
tv6.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
l1.setVisibility(View.GONE);
l2.setVisibility(View.GONE);
l3.setVisibility(View.GONE);
l4.setVisibility(View.GONE);
l5.setVisibility(View.GONE);
l6.setVisibility(View.VISIBLE);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
Xav*_*ler 637
你可以做两件事来添加动画,首先你可以让android动画布局改变你.这样每次你在布局中改变一些东西,如改变视图可见性或视图位置,android将自动创建淡入淡出/过渡动画.要使用该集
android:animateLayoutChanges="true"
Run Code Online (Sandbox Code Playgroud)
在布局中的根节点上.
您的第二个选择是手动添加动画.为此,我建议您使用Android 3.0(Honeycomb)中引入的新动画API.我可以举几个例子:
这淡出了View
:
view.animate().alpha(0.0f);
Run Code Online (Sandbox Code Playgroud)
这使它逐渐消失:
view.animate().alpha(1.0f);
Run Code Online (Sandbox Code Playgroud)
这会View
向下移动高度:
view.animate().translationY(view.getHeight());
Run Code Online (Sandbox Code Playgroud)
在View
将其移动到其他位置之后,它将返回到其起始位置:
view.animate().translationY(0);
Run Code Online (Sandbox Code Playgroud)
您还可以使用它setDuration()
来设置动画的持续时间.例如,这会View
在2秒内淡出:
view.animate().alpha(0.0f).setDuration(2000);
Run Code Online (Sandbox Code Playgroud)
并且您可以根据需要组合尽可能多的动画,例如,这会逐渐淡出View
并在0.3秒内同时向下移动:
view.animate()
.translationY(view.getHeight())
.alpha(0.0f)
.setDuration(300);
Run Code Online (Sandbox Code Playgroud)
您还可以为动画分配侦听器并对各种事件做出反应.就像动画开始,结束或重复等一样.通过使用抽象类,AnimatorListenerAdapter
您不必AnimatorListener
一次实现所有回调,而只需要实现所需的回调.这使代码更具可读性.例如,下面的代码View
在0.3秒(300毫秒)的时间内淡出它的高度,并且当动画完成时,其可见性设置为View.GONE
.
view.animate()
.translationY(view.getHeight())
.alpha(0.0f)
.setDuration(300)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
Run Code Online (Sandbox Code Playgroud)
ash*_*rov 32
动画化Visibility
更改的最简单方法是使用Transition API
支持(androidx)软件包中可用的方法。只需调用TransitionManager.beginDelayedTransition
方法,然后更改视图的可见性。有喜欢的几个默认的转变Fade
,Slide
。
import androidx.transition.TransitionManager;
import androidx.transition.Transition;
import androidx.transition.Fade;
private void toggle() {
Transition transition = new Fade();
transition.setDuration(600);
transition.addTarget(R.id.image);
TransitionManager.beginDelayedTransition(parent, transition);
image.setVisibility(show ? View.VISIBLE : View.GONE);
}
Run Code Online (Sandbox Code Playgroud)
动画视图的parent
父级在哪里ViewGroup
。结果:
这是Slide
过渡的结果:
import androidx.transition.Slide;
Transition transition = new Slide(Gravity.BOTTOM);
Run Code Online (Sandbox Code Playgroud)
如果需要其他功能,编写自定义过渡很容易。这是CircularRevealTransition
我在另一个答案中写的例子。它使用CircularReveal动画显示和隐藏视图。
Transition transition = new CircularRevealTransition();
Run Code Online (Sandbox Code Playgroud)
android:animateLayoutChanges="true"
选项做同样的事情,它只是使用自动转换作为过渡。
Nul*_*ion 24
请检查此链接.这将允许像L2R,R2L,T2B,B2T动画这样的动画.
此代码从左到右显示动画
TranslateAnimation animate = new TranslateAnimation(0,view.getWidth(),0,0);
animate.setDuration(500);
animate.setFillAfter(true);
view.startAnimation(animate);
view.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)
如果你想从R2L那里做,那就用吧
TranslateAnimation animate = new TranslateAnimation(0,-view.getWidth(),0,0);
Run Code Online (Sandbox Code Playgroud)
从上到下为
TranslateAnimation animate = new TranslateAnimation(0,0,0,view.getHeight());
Run Code Online (Sandbox Code Playgroud)
反之亦然..
Ric*_*omo 13
尝试将此行添加到axml父布局
android:animateLayoutChanges="true"
Run Code Online (Sandbox Code Playgroud)
jia*_*hao 11
基于@Xaver Kapeller的答案,我想出了一种在屏幕上出现新视图时创建滚动动画的方法(以及隐藏它们的动画).
它来自这个状态:
至
反之亦然.
因此,当用户点击第一个按钮时,元素"按钮1","按钮2","按钮3"和"按钮4"将使用淡入淡出动画出现,元素"最后一个按钮"将向下移动直到结束.布局的高度也会改变,允许正确使用滚动视图.
这是用动画显示元素的代码:
private void showElements() {
// Precondition
if (areElementsVisible()) {
Log.w(TAG, "The view is already visible. Nothing to do here");
return;
}
// Animate the hidden linear layout as visible and set
// the alpha as 0.0. Otherwise the animation won't be shown
mHiddenLinearLayout.setVisibility(View.VISIBLE);
mHiddenLinearLayout.setAlpha(0.0f);
mHiddenLinearLayout
.animate()
.setDuration(ANIMATION_TRANSITION_TIME)
.alpha(1.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
updateShowElementsButton();
mHiddenLinearLayout.animate().setListener(null);
}
})
;
mLastButton
.animate()
.setDuration(ANIMATION_TRANSITION_TIME)
.translationY(mHiddenLinearLayoutHeight);
// Update the high of all the elements relativeLayout
LayoutParams layoutParams = mAllElementsRelativeLayout.getLayoutParams();
// TODO: Add vertical margins
layoutParams.height = mLastButton.getHeight() + mHiddenLinearLayoutHeight;
}
Run Code Online (Sandbox Code Playgroud)
这是隐藏动画元素的代码:
private void hideElements() {
// Precondition
if (!areElementsVisible()) {
Log.w(TAG, "The view is already non-visible. Nothing to do here");
return;
}
// Animate the hidden linear layout as visible and set
mHiddenLinearLayout
.animate()
.setDuration(ANIMATION_TRANSITION_TIME)
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
Log.v(TAG, "Animation ended. Set the view as gone");
super.onAnimationEnd(animation);
mHiddenLinearLayout.setVisibility(View.GONE);
// Hack: Remove the listener. So it won't be executed when
// any other animation on this view is executed
mHiddenLinearLayout.animate().setListener(null);
updateShowElementsButton();
}
})
;
mLastButton
.animate()
.setDuration(ANIMATION_TRANSITION_TIME)
.translationY(0);
// Update the high of all the elements relativeLayout
LayoutParams layoutParams = mAllElementsRelativeLayout.getLayoutParams();
// TODO: Add vertical margins
layoutParams.height = mLastButton.getHeight();
}
Run Code Online (Sandbox Code Playgroud)
注意隐藏动画的方法有一个简单的黑客攻击.在动画侦听器mHiddenLinearLayout上,我必须使用以下命令删除侦听器本身:
mHiddenLinearLayout.animate().setListener(null);
Run Code Online (Sandbox Code Playgroud)
这是因为一旦动画侦听器附加到视图,下次在此视图中执行任何动画时,也将执行侦听器.这可能是动画侦听器中的错误.
该项目的源代码在GitHub上:https: //github.com/jiahaoliuliu/ViewsAnimated
快乐的编码!
更新:对于附加到视图的任何侦听器,应在动画结束后将其删除.这是通过使用完成的
view.animate().setListener(null);
Run Code Online (Sandbox Code Playgroud)
基于@ashakirov 的回答,这是我使用淡入淡出动画显示/隐藏视图的扩展
fun View.fadeVisibility(visibility: Int, duration: Long = 400) {
val transition: Transition = Fade()
transition.duration = duration
transition.addTarget(this)
TransitionManager.beginDelayedTransition(this.parent as ViewGroup, transition)
this.visibility = visibility
}
Run Code Online (Sandbox Code Playgroud)
使用示例
view.fadeVisibility(View.VISIBLE)
view.fadeVisibility(View.GONE, 2000)
Run Code Online (Sandbox Code Playgroud)
我的解决方案扩展
fun View.slideVisibility(visibility: Boolean, durationTime: Long = 300) {
val transition = Slide(Gravity.BOTTOM)
transition.apply {
duration = durationTime
addTarget(this@slideVisibility)
}
TransitionManager.beginDelayedTransition(this.parent as ViewGroup, transition)
this.isVisible = visibility
}
Run Code Online (Sandbox Code Playgroud)
使用:
textView.slideVisibility(true)
Run Code Online (Sandbox Code Playgroud)
我能够以这种方式显示/隐藏菜单:
MenuView.java(扩展FrameLayout)
private final int ANIMATION_DURATION = 500;
public void showMenu()
{
setVisibility(View.VISIBLE);
animate()
.alpha(1f)
.setDuration(ANIMATION_DURATION)
.setListener(null);
}
private void hideMenu()
{
animate()
.alpha(0f)
.setDuration(ANIMATION_DURATION)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
setVisibility(View.GONE);
}
});
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
187547 次 |
最近记录: |