为什么我的AdapterViewAdapter在AppWidget中使用时会闪烁?

时间:2014-05-10 09:54:20

标签: java android android-appwidget android-adapterview

我创建了一个简单的主屏幕小部件,可以显示简单的图像幻灯片。为了在图像之间切换,我使用AdapterViewFlipper,每1.5秒只显示下一个图像。这很好但在从一个图像到下一个图像的过渡期间,它似乎淡出和淡入(几乎像过渡动画),我想禁用它。我怎么能这样做?我已经在布局XML中禁用了动画,但它没有帮助。我很困惑。

这是我的布局包含鳍状肢:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/widget_frame"
    android:orientation="vertical"
    android:textAlignment="gravity" >

    <AdapterViewFlipper
        android:id="@+id/image_flipper"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/widget_icon"
        android:animateLayoutChanges="false"
        android:autoStart="true"
        android:flipInterval="1500" >

    </AdapterViewFlipper>

</LinearLayout>

当appwidget加载时,我将鳍状肢绑定到它的适配器:

Intent ittSlides = new Intent(ctxContext, SlideService.class);
ittSlides.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, intInstance);
ittSlides.setData(Uri.fromParts("content", String.valueOf(new Random().nextInt()), null));
ittSlides.putExtra("data", strContent);

RemoteViews remView = new RemoteViews(ctxContext.getPackageName(), R.layout.widget);
remView.setRemoteAdapter(R.id.image_flipper, ittSlides);

AppWidgetManager.getInstance(ctxContext).updateAppWidget(intInstance, remView);

..而且这是我的实际适配器。

public class SlideFactory implements RemoteViewsFactory {
    private JSONArray jsoImages;
    private final Context ctxContext;
    private RemoteViews remView;

    public SlideFactory(Context ctxContext, Intent ittIntent) {

        remView = new RemoteViews(ctxContext.getPackageName(), R.layout.image);
        this.ctxContext = ctxContext;
        try {
            jsoImages = new JSONArray(ittIntent.getStringExtra("data"));
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public RemoteViews getViewAt(int intPosition) {
        try {
            remView.setImageViewUri(R.id.dopper_image, Uri.parse(jsoImages.getString(intPosition)));
        } catch (final JSONException e) {
            Log.e("SlideFactory", "Unknown error encountered", e);
            BugSenseHandler.sendException(e);
        } catch (final Exception e) {
            Log.e("SlideFactory", "Unknown error encountered", e);
            BugSenseHandler.sendException(e);
        }
        return remView;
    }

    ...
    ...
    ...
}

正如您所看到的,适配器没有什么特别之处。我只是简单地从磁盘中读取图像并将其设置为具有ImageView的布局,然后我将其提供给AdapterViewFlipper

1 个答案:

答案 0 :(得分:3)

我也遇到了同样的问题并且偶然找到了解决方案。这更像是棘手的解决方案。这实际上是通过添加没有动画设置的动画来禁用动画效果。

1.在anim文件夹下添加两个XML。我会说in.xmlout.xml,但你可以使用任何一个或两个XML。

2.在XML中添加空白objectAnimator元素

<?xml version="1.0" encoding="UTF-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"/>
  1. android:inAnimation="@anim/in"

  2. 中添加android:outAnimation="@anim/out"AdapterViewFlipper
  3. 构建你的应用程序,神奇地,动画将被禁用!