代码之家  ›  专栏  ›  技术社区  ›  MojoFilter

使用动态绘制的内容实现Android小部件的正确方法是什么?

  •  13
  • MojoFilter  · 技术社区  · 15 年前

    对于我的第一个也是最棒的Android项目,我想创建一个主屏幕小部件,显示其中一个 Arc Clocks 现在所有的孩子都在胡闹。

    基于 RemoteViews 在我看来,让它真正在屏幕上显示的适当方法是使用 ImageView 在实际布局中,然后在更新时创建 ShapeDrawable 或者两个,把它们画到一个新创建的 Bitmap .然后,将该位图设置为ImageView的源。

    不过,在这个过程中,我并不是在摸索。下面是我试图用来更新小部件的代码。我在屏幕上什么也看不到。ImageView的占位符图像刚刚由其 src 财产。当我不运行代码将其更新到我的绘图时,占位符图像将保持原位。所以,我知道这个代码在做什么 某物 很明显不是 正确的 事情。

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
    Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    
    ShapeDrawable drawable = new ShapeDrawable(new ArcShape(0, 360));
    drawable.getPaint().setColor(0xffff0000);
    drawable.getPaint().setStrokeWidth(5.0f);
    drawable.setIntrinsicWidth(100);
    drawable.setIntrinsicHeight(100);
    drawable.draw(canvas);
    
    views.setImageViewBitmap(R.id.ImageView01, bitmap);     
    appWidgetManager.updateAppWidget(appWidgetId, views);
    

    我知道不会那么容易。所以,我是不是朝着正确的方向前进?


    更新

    好吧,也许信息太多了。我真正想问的问题是:

    如果我想在一个小部件上绘制形状,我应该使用一个ImageView并从我的ShapeDrawable创建一个位图,还是有更合适的方法来绘制到一个小部件中,它受远程视图的约束?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Josef Pfleger    15 年前

    实际上有一个叫做 AnalogClock 在SDK中,这与您尝试执行的操作非常相似。

    它被实现为一个扩展 View 并用注释 @RemoteView . 它在上注册接收器 Intent.ACTION_TIME_TICK Intent.ACTION_TIME_CHANGED 并通过覆盖 onDraw 方法。退房 source . 标准 AlarmClock 应用 exposes this view 作为一个可以添加到主屏幕的小部件。

    我认为这是一个很好的(如果不是最好的)方法来实现你所描述的,显然效果很好。

        2
  •  5
  •   CrazyChris    14 年前

    这很有效:

    Paint p = new Paint(); 
    p.setAntiAlias(true);
    p.setStyle(Style.STROKE);
    p.setStrokeWidth(8);
    p.setColor(0xFFFF0000);
    
    Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    canvas.drawArc(new RectF(10, 10, 90, 90), 0, 270, false, p);
    
    RemoteViews views = new RemoteViews(updateService.getPackageName(), R.layout.main);
    views.setImageViewBitmap(R.id.canvas, bitmap);
    
    ComponentName componentName = new ComponentName(updateService, DashboardAppWidgetProvider.class);
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(updateService);
    appWidgetManager.updateAppWidget(componentName, views);
    

    我猜您的原始代码的问题只是绘制弧的方式——这就是为什么没有任何东西出现的原因。

    顺便说一句:通过搜索“ARC时钟”,您可以在市场上找到一个内存占用非常小的可定制“ARC时钟”!

        3
  •  0
  •   Jay Askren    15 年前

    要创建自定义组件,我将扩展视图或视图的任何子类,并重写OnDraw(Canvas Canvas)方法来进行绘图。在Canvas对象上,可以调用DrawLine()、DrawArc()、DrawPicture()、DrawPoints()、DrawText()、DrawRect()等方法…

    Here's more details.

    Here's the api for canvas.

    我相信你可以将你的自定义视图添加到远程视图中,以便制作一个小部件。