当我使用图库小部件(Gallery widget)时,如何让选中的图像放大并发光,而取消选择后则缩小并失去发光效果? 我看过所有的教程,但是没有看到这个效果...
是否需要将某种动画效果(animation)附加到图库(Gallery)上?
是否需要将某种动画效果(animation)附加到图库(Gallery)上?
Gallery
小部件成功地“模拟”了缩小/放大的解决方案。由于他们删除了getScale()
,使事情变得有些复杂。我认为这不是最好的解决方案,但至少我可以处理它。Gallery
管理焦点非常糟糕。因此,第一种方法是在显示的ImageView
上添加焦点更改侦听器,但没有成功。焦点混乱......选定的图像不是当前聚焦的视图。我向android-developers邮件列表发送了一封邮件,提到了API文档中的一些错误(关于focusSearch()
方法和一些焦点常数)。<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1.0"
android:toXScale="1.10"
android:fromYScale="1.0"
android:toYScale="1.10"
android:duration="300"
android:pivotX="50%"
android:pivotY="50%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fillAfter="false"/>
如果您不明白这是什么意思,那么您应该继续阅读这个
这将是我们的“增长”效果,您需要将其保存在:res/anim/grow.xml
或任何适合您的名称(但始终在res/anim目录中)。
您可以从这里遵循资源指南创建Gallery
视图。 ImageAdapter
每次Gallery
对象调用getView()
时都会构建一个ImageView
。您可以实现的一种解决方法是向getView()
方法添加一行代码,以通过position
标识一个View
:
...
i.setId(position);
...
在ImageAdapter
对象的getView()
方法中添加该行代码后,您可以在监听器中明确地识别该视图,例如:
g.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected (AdapterView<?> parent, View v, int position, long id) {
Animation grow = AnimationUtils.loadAnimation(YourActivity.this, R.anim.grow);
View sideView = parent.findViewById(position - 1);
if (sideView != null)
((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));
sideView = parent.findViewById(position + 1);
if (sideView != null)
((ImageView)sideView).setLayoutParams(new Gallery.LayoutParams(150, 100));
v.startAnimation(grow);
v.setLayoutParams(new Gallery.LayoutParams(170, 150));
}
public void onNothingSelected (AdapterView<?> parent) {
System.out.println("NOTHING SELECTED");
}
});
private class SelectListener implements AdapterView.OnItemSelectedListener {
private Animation grow;
private int last;
public SelectListener() {
grow = AnimationUtils.loadAnimation(RouteGallery.this, R.anim.grow);
last = 0;
}
public void onItemSelected (AdapterView<?> parent, View v, int position, long id) {
View sideView = parent.findViewById(last);
if (sideView != null && last != position)
sideView.clearAnimation();
v.startAnimation(grow);
last = position;
}
public void onNothingSelected (AdapterView<?> parent) {
}
}
您需要使用ImageSwitcher。ImageSwitcher有设置选中和取消选中或选中和替换时的进入和退出动画的方法。
以下链接提供了一个很好的教程,介绍如何将其与Gallery一起使用。
我实现了类似于这样的动画:
final Animation shrink = AnimationUtils.loadAnimation(activity, R.anim.shrink);
shrink.setFillAfter(true);
gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// This iterates through the views which are currently displayed on screen.
for (int k=0; k<gallery.getChildCount(); k++){
// Do whatever else you want, here.
// This is how you get a particular element of a view
ImageView background = (ImageView) gallery.getChildAt(k).findViewById(R.id.menu_item_background);
//clear animation
gallery.getChildAt(k).clearAnimation();
}
// Scale the selected one
view.startAnimation(shrink);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {}
});