簡體   English   中英

Android:如何向小部件添加自定義圖像?

[英]android: how to add a customized image to widgets?

我是在android中創建/更改任何類型圖像的新手。 我正在嘗試做的是以下內容:

我有一個小部件,它會從廣播接收器中定期更新。 事情是,我想在此小部件中顯示一個自制的(即以編程方式創建的)圖像。 而且我實際上不知道如何將圖像添加到小部件布局中。 誰能幫我嗎? 這是更新小部件的代碼:

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());

        int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

        // DO SOME THINGS...

        ComponentName myWidget = new ComponentName(context.getApplicationContext(), MyWidgetProvider.class);

        int[] allMyWidgetIds = appWidgetManager.getAppWidgetIds(myWidget);  

        for (int widgetId : allMyWidgetIds) {
            RemoteViews rViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            rViews.setTextViewText(R.id.TextView01, "xyz"); // this works just fine, i.e. it gets updated as intended :)

            appWidgetManager.updateAppWidget(widgetId, rViews);
        }

        // set next update
        Calendar c = Calendar.getInstance();
        c.add(Calendar.SECOND, Config.UPDATE_RATE);

        Date d = new Date(c.getTimeInMillis());
        Intent i = new Intent(context.getApplicationContext(), MyReceiver.class);

        i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
        PendingIntent sender = PendingIntent.getBroadcast(context.getApplicationContext(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager aManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        aManager.set(AlarmManager.RTC, d.getTime(), sender);
    }
}

所以這很好用。 在將“ xyz”寫入TextView的行中,我先前組裝的數據(在broadcastreceiver中)按預期顯示,即得到更新。 在這一點上,我想“繪制”此數據,即創建一個應在小部件中顯示的圖形。

但是:我該怎么做? 我想我最后會有一個繪畫。 我如何實際將其顯示在小部件中(當然也要進行更新)?

更新:

這是應該執行圖形的視圖類。 到目前為止,它只是畫一條短線。 如果我通過活動中的setContentView()將其設置為視圖,則此方法有效:

public class Chart extends View {   
    public Chart(Context context) {
        super(context);
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        Paint paint = new Paint();
        paint.setFlags(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLACK);

        canvas.drawLine(0, 0, 30, 30, paint);
    }
}

小部件的布局非常無聊:

<?xml version="1.0" encoding="utf-8"?>

<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/traffic_shape" >
    <TextView
        android:id="@+id/TextView01"
        android:text="test"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </TextView>
    <ImageView 
        android:id="@+id/graph"
        android:contentDescription="blah"
        android:src="@drawable/icon"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ImageView>
</LinearLayout>

不,如何獲取在圖表類中創建的視圖以顯示在小部件中? 不幸的是,RemoteViews似乎沒有提供任何功能來設置視圖... :(

看來我必須回答自己的問題。 經過數小時的努力>>(

for (int widgetId : allWidgetIds)
{
    RemoteViews rViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

    Graph graph = new Graph();
    rViews.setImageViewBitmap(R.id.graph, graph.getBitmap());

    appWidgetManager.updateAppWidget(widgetId, rViews);
}

與Graph.java是這樣的:

public class Graph {
    public Bitmap getBitmap() {
        Bitmap bitmap = Bitmap.createBitmap(128, 128, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        canvas.drawColor(Color.WHITE);

        Paint paint = new Paint();

        paint.setFlags(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.RED);
        canvas.drawLine(0, 0, 128, 128, paint);
        return bitmap;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM