我正在寻找动画我拥有的视图。它是一个列表视图项,因此当它出现在列表中时,它具有 android:layout_width 属性的 fill_parent 值。有了它,它填充了列表视图的整行。我想要发生的是,一旦将项目添加到列表中,我希望将 layout_width 设置为 wrap_content 值。我知道我可以通过更改 LayoutParams 来完成,但它不会被动画化。我所说的内容的一个很好的参考是在 Google Hangouts 应用程序中。将项目添加到对话列表后,该项目将缩放到列表视图项目上的 wrap_content。有没有人知道图书馆或者可以为我指明正确方向的东西?
3 回答
您无法更改布局并同时为其设置动画,但您可以做到这一点:您的项目布局必须包含put 两个子项的ViewSwitcher
内部,两个,一个带有您的项目展开视图,另一个带有折叠视图. 像这样的东西:ViewSwitcher
RelativeLayout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!- Change the in and out animation for some scale animation ->
<ViewSwitcher
android:id="@+id/viewswitcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inAnimation="@android:anim/slide_in_left"
android:outAnimation="@android:anim/slide_out_right" >
<RelativeLayout
android:id="@+id/expanded_item"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/editText_expanded"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:ems="10"
android:text="TextExpanded" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/collapsed_item"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/editText_collapsed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:text="TextCollapsed" >
</TextView>
</RelativeLayout>
</ViewSwitcher>
</RelativeLayout>
现在我不知道你什么时候想要执行动画。您有两种选择:一种是在 onFocus 事件上制作动画。两个获取您的视图实例并使用post(someRunnable)
. 如果您选择第一个,则当用户向下滚动并看到项目时将执行动画,即使该项目是很久以前添加的,但该项目从未获得焦点。如果您选择第二个选项,则在您添加新元素时将执行动画(我认为),无论您是否实际看到该项目。我不太确定最后一个,因为 的getView
是以 BaseAdapter
懒惰的方式执行的。您的适配器必须是这样的:
public class MyListViewAdapter extends BaseAdapter {
List<String> model;
private LayoutInflater inflater;
private Boolean animated;
public MyListViewAdapter(MainActivity mainActivity,
List<String> modelArray, Boolean anim) {
model = modelArray;
inflater = LayoutInflater.from(mainActivity);
animated = anim;
}
@Override
public int getCount() {
return model.size();
}
@Override
public Object getItem(int arg0) {
return model.get(arg0);
}
@Override
public long getItemId(int arg0) {
return -1l;
}
@Override
public View getView(int pos, View convertedView, ViewGroup parent) {
if (convertedView == null) {
convertedView = inflater.inflate(R.layout.custom_view, null, false);
}
TextView textCollapsed = (TextView) convertedView.findViewById(R.id.editText_collapsed);
TextView textExpanded = (TextView) convertedView.findViewById(R.id.editText_expanded);
textCollapsed.setText(model.get(pos));
textExpanded.setText(model.get(pos));
final ViewSwitcher switcher = (ViewSwitcher) convertedView.findViewById(R.id.viewswitcher);
//First choice
convertedView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
ViewSwitcher switcher2 = (ViewSwitcher) v.findViewById(R.id.viewswitcher);
switcher2.showPrevious();
}
}
})
//Second choice
switcher.post(new Runnable() {
@Override
public void run() {
switcher.showPrevious();
}
});
return convertedView;
}
}
那么你必须玩这个,看看会发生什么。对不起,我不能给你一个 100% 准确的答案。但我确信这是要走的路。希望能帮助到你 :]
顺便说一句,很好的问题!
您只需要制作自己的列表视图项布局并在其中有一个文本视图,然后您就可以管理列表项的显示方式,请参见Android listview customization
、Customizing list item throught ArrayAdapter
和Related Post about it
如果您知道要设置动画的确切整数值(或dp
, em
, dip
,%
值),则可以使用droidQuery库来执行此操作。只需使用以下命令:
$.with(myView).animate("{width: " + widthValue /* must be an int */ + "}", new AnimationOptions().duration(1000).easing($.Easing.ACCELERATE_DECELERATE));
AnimationOptions
默认情况下,持续时间为 400 毫秒和线性缓动。您还可以设置动画成功完成时调用的函数,例如:
new AnimationOptions().success(new Function() {
@Override
public void invoke($ d, Object... args) {
//TODO
}
});
如果您想使用百分比或 dp 等 - 只需将其添加到动画字符串。例如,对于 50% 的宽度,使用:
$.with(myView).animate("{width: 50%}", new AnimationOptions());
但是请记住,这可能会导致 a 出现问题ListView
,因为它LayoutParams
不从ViewGroup.LayoutParams
.