安卓:如何在画廊视图中使用动画?

11
当我使用图库小部件(Gallery widget)时,如何让选中的图像放大发光,而取消选择后则缩小失去发光效果? 我看过所有的教程,但是没有看到这个效果...
是否需要将某种动画效果(animation)附加到图库(Gallery)上?

我正在做同样的事情,但在一些安卓设备上无法正常工作。如果您已经在画廊视图中实现了这个动画,请发送给我代码。 - Hasmukh
3个回答

15
希望这对您有所帮助。我使用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");

    }
    });

注意:您可能会注意到,动画和布局参数的所有值都是由我手动选择的。这是因为我不打算为您清理代码。同时,这只是一个解决此小部件或Android视图系统中糟糕焦点问题的变通方法。如果焦点正常,则您所需做的就是设置一个焦点更改侦听器,在获得/失去焦点时使其放大/缩小。
我希望这可以帮助您找到解决问题的方法,
问候,
新编辑:这是我设置的侦听器,我还在getView()方法中添加了i.clearAnimation()行:
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) {
    }
}

+1 没有看到这个。作为答案被接受了。谢谢你们的时间!非常有帮助。 - Legend

4

您需要使用ImageSwitcher。ImageSwitcher有设置选中和取消选中或选中和替换时的进入和退出动画的方法。

以下链接提供了一个很好的教程,介绍如何将其与Gallery一起使用。


抱歉,我没有注意到,但我仍然找不到在图像切换器本身中缩放图像的方法...我的意思是可见的顶部部分...当单击时,它应该给我们一个正常大小或者缩小的大小...我是否错过了一些微不足道的解决方案? - Legend

2

我实现了类似于这样的动画:

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) {}

    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接