15

私の最初の、そして最も素晴らしい Android プロジェクトとして、最近すべての子供たちが熱狂しているアーク時計の 1 つを表示するホーム画面ウィジェットを作成したいと考えています。

RemoteViewsの制限に基づいて、実際に画面に描画する適切な方法は、実際のレイアウトでImageViewを使用し、更新時にShapeDrawableを1 つまたは 2 つ作成し、それらを新しく描画することです。ビットマップを作成しました。次に、その 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 からビットマップを作成する必要がありますか、それとも RemoteViews によって制約されているウィジェットに描画するより適切な方法はありますか?

4

3 に答える 3

8

実際AnalogClock、SDK で呼び出されるウィジェットがあり、これはあなたがしようとしていることと非常によく似ています。

Viewこれは、拡張され、で注釈が付けられたクラスとして実装され@RemoteViewます。レシーバーを登録しIntent.ACTION_TIME_TICK、メソッドIntent.ACTION_TIME_CHANGEDをオーバーライドして自分自身を描画します。ソースonDrawをチェックしてください。標準のAlarmClockアプリケーションは、このビューをホーム画面に追加できるウィジェットとして公開します。

あなたが説明したことを実装するための良い(最善ではないにしても)方法であり、明らかにうまく機能すると思います。

于 2010-02-08T20:28:26.130 に答える
5

これはうまく機能します:

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);

元のコードの問題は、円弧を描く方法だけだったと思います。そのため、何も表示されませんでした。

ところで:「アーククロック」を検索すると、市場で非常に小さなメモリフットプリントを持つカスタマイズ可能な「アーククロック」を見つけることができます!

于 2010-08-05T13:49:28.860 に答える
0

カスタム コンポーネントを作成するには、View または View のサブクラスを拡張し、onDraw(Canvas canvas) メソッドをオーバーライドして描画を行います。キャンバス オブジェクトでは、drawLine()、drawArc()、drawPicture()、drawPoints()、drawText()、drawRect() などのメソッドを呼び出すことができます。

詳細はこちら。

これがキャンバスのAPIです。

ウィジェットを作成する目的で、カスタム ビューをリモート ビューに追加できると思います。

于 2010-02-06T20:50:45.573 に答える