6

私はしばらく Android をプログラミングしてきましたが、これは本当に困惑しています。

したがって、テキストビューを備えた単純な appwidget があります。アプリのサイズが変更された場合にテキストを大きくするために、ユーザーがウィジェットのサイズを変更した場合、そのテキストビュー内のテキストのフォントサイズを拡大/縮小したいだけです。いくつかの解決策を試しましたが、すべて失敗しました:

  1. フォントサイズに「sp」(スケーリングされたピクセル)単位を使用するだけです-これは、ウィジェットのサイズが変更されたときにテキストをスケーリングしません(私もそれを期待していませんでした!)。

  2. 独自の onSizeChanged メソッドを使用して TextView を拡張します。ただし、基本的な UI クラスの子孫をウィジェットに含めることはできません (ドキュメントにも記載されています)。

現在の appWidget サイズを取得する方法さえないため、ここで立ち往生しています。

はい、解決策の 1 つは、1x4 や 2x4 などの異なるバージョンのウィジェットを作成することですが、確かに別の方法がありますか?

どんなアイデアでも大歓迎ですか?

4

4 に答える 4

4

親のサイズに基づいて TextView のテキストを自動的にスケーリングすることはできません。回避策は、TextView のメソッドをオーバーライドしonDraw、スケーリングを手動で実装することです。

appwidgets について: サイズ変更可能な appwidget の現在のサイズを取得することはできません。これは、コンテナーでの使用を意図しているためListViewですGridView。これらのコンテナーは、コンテンツのスケーリングと間隔を自動的に管理し、コンテンツが appwidget の現在のサイズに収まらない場合はスクロール可能にします。

ListViewaまたは aを使用していない場合GridView、appwidget のコンポーネントを「スケーリング」する最良の方法は、既に述べた方法です。サイズ変更できない別の appwidget を使用します。

于 2012-09-02T14:43:55.160 に答える
3

上記の回答とhttps://stackoverflow.com/a/7875656/6364860の素敵なコード スニップを組み合わせて、次のように動作するようにしました。

* 注: テキスト付きの円形のボタンがあったため、最小の寸法のみが必要でした。

@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions){

    super.onAppWidgetOptionsChanged(context,appWidgetManager,appWidgetId,newOptions);

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        int maxWidth = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
        int maxHeight = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);

        int size = Math.min(maxHeight,maxWidth);
        int pxSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,size,context.getResources().getDisplayMetrics());

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_button);
        float newSize = refitText(context.getString(R.string.button_text),pxSize);

        remoteViews.setTextViewTextSize(R.id.widget_text, TypedValue.COMPLEX_UNIT_PX,newSize);

        appWidgetManager.updateAppWidget(appWidgetId,remoteViews);
    }

}

private float refitText(String text, int textWidth)
{
    if (textWidth <= 0)
        return 0;

    float hi = 100;
    float lo = 2;
    final float threshold = 0.5f; // How close we have to be

    Paint testPaint = new Paint();

    while((hi - lo) > threshold) {
        float size = (hi+lo)/2;
        testPaint.setTextSize(size);
        if(testPaint.measureText(text) >= textWidth)
            hi = size; // too big
        else
            lo = size; // too small
    }
    // Use lo so that we undershoot rather than overshoot
    return lo;
}
于 2016-10-15T14:22:25.233 に答える
3

AppWidgetManager.getAppWidgetOptions(OPTION_APPWIDGET_MAX_WIDTH)を呼び出して最大幅 (ウィジェットの高さと同じ方法) を取得し、それに応じてテキスト サイズを調整できます。制限: このメソッドは API レベル 16 以降で使用できます

于 2012-11-23T09:25:29.173 に答える
1

これは原始的な方法ですが、機能します:

AppWidgetManager manager = AppWidgetManager.getInstance(this);
ComponentName thisWidget = new ComponentName(this, AppWidget.class);
int[] widgetId = manager.getAppWidgetIds(thisWidget);
Bundle options;
options = manager.getAppWidgetOptions(widgetIds[1]);
int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
int maxWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
int maxHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
int maxtextLen = (maxWidth / currentTextSize) * (maxHeight / currentTextSize);

Boolean isFit = maxtextLen > textInWidgetTextView.length();
于 2016-01-23T02:33:10.650 に答える