在时间轴中切换图像小部件

Posted

技术标签:

【中文标题】在时间轴中切换图像小部件【英文标题】:switching an image widget in timeline 【发布时间】:2020-05-13 06:50:09 【问题描述】:

我想创建一个带有延时切换图像的 android 小部件。我不知道该怎么做。我应该在方法 onUpdate 中创建线程吗? 我的 layout.xml 文件的这个例子:

    <ImageButton
        android:id="@+id/imageViewWGT"
        android:background="@drawable/dog" />

这就是我想知道的正确方法:

public class MainActivity extends AppWidgetProvider 
    private int counter = 0;
    private ImageView wgt_img;
    wgt_img = wgt_img.findViewById(R.id.imageViewWGT);

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 

        new Thread(new Runnable() 
            @Override
            public void run() 
                while (true) 
                    runOnUiThread(new Runnable() 
                        @Override
                        public void run() 

                            if (counter%2 == 0)
                                wgt_img.setImageResource(R.drawable.dog);
                            else
                                wgt_img.setImageResource(R.drawable.cat);

                        
                    );
                    counter++;
                    try 
                        Thread.sleep(1000);     // sleep 1 sec
                     catch (InterruptedException e) 
                        e.printStackTrace();
                    
                
            
        ).start();
    

【问题讨论】:

【参考方案1】:

你可以使用Handler类的postDelayed方法

// Initialisation
Handler handler = new Handler();
int counter = 0;
long switchDelay = 1000L;

// Function for switch images
public void switchImage()
     handler.postDelayed(new Runnable() 
         @Override
         public void run() 
             if (counter%2 == 0)
                 wgt_img.setImageResource(R.drawable.dog);
             else 
                 wgt_img.setImageResource(R.drawable.cat);
             
             counter++;
             // Recall method
             switchImage();
         
     , 1000);
 

【讨论】:

我应该在方法onUpdate 中使用函数switchImage() 吗? @allobzor 是的,你这样做【参考方案2】:

当您需要按时运行一段代码时,您可以使用 Timer。 看看这个示例代码:

new Timer().scheduleAtFixedRate(new TimerTask() 
    
        @Override
        public void run() 
        
            //you'r code        
        
     , DELAY , PERIOD);

在 run 方法中添加您的代码并替换您的延迟和执行时间段而不是 DELAY 和 PERIOD 。 DELAY 和 PERIOD 是毫秒

如果你想延迟运行你的块代码一次,你可以使用 Handler。

new Handler().postDelayed(new Runnable() 
    
        @Override
        public void run() 
        
            //you'r code
        
     , DEALY_MILLIS);

【讨论】:

【参考方案3】:

android 有一个默认方法来更新时间轴中的小部件

<appwidget-provider
    ...
    ...
    ...
    ...
    android:updatePeriodMillis="1000000">
</appwidget-provider>

但如果您至少 30 分钟更新小部件,它会起作用

【讨论】:

以上是关于在时间轴中切换图像小部件的主要内容,如果未能解决你的问题,请参考以下文章

matlab中的GUI,轴中的图像循环

在recycleview时间轴中为每个视图添加drawable

在 Chrome 开发工具时间轴中:红色标记是啥意思?

vis.js 时间轴中不存在集群选项

AngularJS:在时间轴中解析 HTML 事件

javascript TimelineLite在时间轴中的特定时间添加补间