在Android小部件上绘制画布

4

我想在小部件上绘制画布,但是没有任何效果。我有一个带有ImageView的表单,其中包含位图,我将在其中绘制所有美丽,但它没有绘制...这是我的一段代码,为什么它不起作用?

我的提供程序,在那里我进行绘制。

public class MainActivity extends AppWidgetProvider {

private Bitmap bmp;
private RemoteViews views;

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    views = new RemoteViews(context.getApplicationContext().getPackageName(), R.layout.main);

    Paint paint = new Paint();
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.RED);
    paint.setTextSize(16);


    paint.setAntiAlias(true);
    paint.setTypeface(Typeface.MONOSPACE);

    Bitmap bmp = Bitmap.createBitmap(100, 16, Bitmap.Config.ALPHA_8);
    Canvas c = new Canvas(bmp);

    c.drawText("fdgfdgfdgfdfdfdgGFDFGFDDDDG", 0, 0, paint);

     views.setImageViewBitmap(R.id.imageView1, bmp);
}

还有我的main.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_layout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dip"
android:background="@drawable/ic_launcher" >
<ImageView 
    android:id="@+id/imageView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ImageView>


请说明程序是否出错或者没有绘制,如果有错误,请提供logcat/stacktrace。 - Hesham Saeed
它只是没有绘制,没有错误消息。 - dajver
3个回答

3

看起来你可能存在几个问题,但这些建议可以帮助你解决其中一些。

首先,你的 onUpdate 方法需要能够处理传递给你的每个小部件的 ID。请注意,用户可以在一个或多个屏幕上创建多个实例的小部件。因此,你需要创建一个循环来绘制所有这些小部件。

其次,当这些小部件准备好更新时,你需要通知小部件管理器。

你可能还需要使用不同的 BitMap 深度。 ALPHA_8 在我的测试中只显示黑色,但 ARGB_4444 可以正常工作。

请注意,你的 Bitmap 和 RemoteViews 成员变量正在隐藏你在方法体中创建的那些变量。建议删除 RemoteViews 成员和堆栈中的 Bitmap。

综上所述,以下是最终结果:

public class MainActivity extends AppWidgetProvider {
    private Bitmap bmp = Bitmap.createBitmap(100, 16, Bitmap.Config.ARGB_4444);

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for(int appWidgetId : appWidgetIds) {
            RemoteViews views = new RemoteViews(...);
            ...
            views.setImageViewBitmap(R.id.imageView1, bmp);
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }

你可能会面临其他问题。例如,所有图形调用都必须在图形线程上执行。实现一个小部件比应用程序要复杂得多。祝好运!


1

尝试为x和y放入不同的值。目前它正在绘制,但超出了位图的边界...所以请尝试一下。


1
你需要调用。
appWidgetManager.updateAppWidget(appWidgetIds, views);

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