AppWidget анимация в Android - PullRequest
       3

AppWidget анимация в Android

0 голосов
/ 20 января 2012

Я создал виджет WiFi, который предоставляет пользователю легкий доступ к WiFi. Функциональные возможности виджета работают нормально. Теперь я хочу показать анимацию виджету. При подключении сигнальной полосы периодически загорайтесь один раз и поднимайтесь вверх, пока не включится WiFi. Для этого я создал массив изображений с разными уровнями сигнала.

Во время соединения я вызываю метод startAnimation.

public void StartAnimation()
{
    System.out.println("start");
    frame = 0;
    animationFlag = true;
    if(!handler.hasMessages(0))
    handler.postDelayed(AnimateRunnable, FRAME_RATE);



}

Из satrtAnimation я делаю анимацию Flag в true.

После этого состояние становится Enbaled или Not connected. В этот раз я вызываю метод stopAnimation.

public void StopAnimation()
{
    System.out.println("Stop Animation Before:"+animationFlag);
    animationFlag = false;
    System.out.println("Stop Animation:After:"+animationFlag);
    if(!handler.hasMessages(0)) {
        System.out.println("handler.hasmessage0");
        handler.removeCallbacks(AnimateRunnable);
    }


}

Здесь я делаю анимационный флаг ложным. и печать его значений до и после. Отображается правильно.

Но в My Runnable флаг анимации остается верным. Так что мой виджет зависает

final Runnable AnimateRunnable =new Runnable(){
    public void run()
    {
        System.out.println("run:"+animationFlag);
        if(animationFlag)
        {
            System.out.println("Animation Flag:"+animationFlag);
            AppWidgetManager ap =AppWidgetManager.getInstance(mContext);
            frame = ++frame%5;
            remoteViews.setImageViewResource(R.id.wifi_signal_strength,rangeImages[frame]);
            ap.updateAppWidget(thisWidget, remoteViews);

                handler.postDelayed(AnimateRunnable, FRAME_RATE);



        }
    }
};

1 Ответ

0 голосов
/ 20 января 2012

Несмотря на то, что макет виджета приложения определен в вашем приложении, это не ваше мнение, и вы не можете управлять им напрямую.Не все представления могут находиться в макете виджета приложения.Это представление управляется модулем запуска, и макет передается ему с помощью непонятных методов (которые мы не можем здесь обсуждать)

Когда вы хотите изменить содержимое виджета приложения, вы должны сделать это с помощью менеджера и объекта удаленных представлений:

   private static void updateWidgetState(Context context, CharSequence amountCameras, String locationCity, String locationStatus) {
    AppWidgetManager manager = AppWidgetManager.getInstance(context);
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.camera_widget_layout);
    views.setOnClickPendingIntent(R.id.camerawidget, PendingIntent.getActivity(context, 0, new Intent(context, CameraWatch.class), PendingIntent.FLAG_UPDATE_CURRENT));
    views.setTextViewText(R.id.widget_amount_cameras, amountCameras);
    views.setTextViewText(R.id.widget_location, locationCity);
    // views.setTextViewText(R.id.widget_security, securityStatus);
    views.setTextViewText(R.id.locationStatus, locationStatus);

    final int[] appWidgetIds = manager.getAppWidgetIds(new ComponentName(CameraWidgetProvider.class.getPackage().getName(), CameraWidgetProvider.class.getName()));

    manager.updateAppWidget(appWidgetIds, views);

    Log.d(LOG_TAG, "widget state changed");
}

См. Документы на RemoteViews - это все, что вы можете получить.Без анимации

...