Подтвердить что ты не робот

Получение размера изображения для создания растрового изображения

Я программист с фоном окон, и я новичок в Java и андроидах,

Я хочу создать виджет (а не приложение), который отображает диаграмму.

после долгого исследования я знаю, что могу сделать это с помощью Canvas, изображений и растровых изображений.

холст, который я рисую, должен быть таким же, как размер виджета.

так что вопрос: как узнать размер виджета (или размер изображения), чтобы я мог предоставить его функции

Bitmap.createBitmap(width_xx, height_yy, Config.ARGB_8888);

Фрагмент кода: в методе запуска таймера:

@Override
    public void run() {
        Bitmap bitmap = Bitmap.createBitmap(??, ??, Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        //create new paint  
        Paint p = new Paint();
        p.setAntiAlias(true);
        p.setStrokeWidth(1);

        //draw circle
        //here i can use the width and height to scale the circle
        canvas.drawCircle(50, 50, 7, p);
        remoteViews.setImageViewBitmap(R.id.imageView, bitmap);
4b9b3361

Ответ 1

Из того, что я узнал, вы можете вычислять размеры виджета только на Android 4.1+. Когда на более низком API вам придется использовать статические измерения. О размерах виджетов: Руководство по дизайну виджета приложений

int w = DEFAULT_WIDTH, h = DEFAULT_HEIGHT;

if ( Build.VERSION.SDK_INT >= 16 ) {
    Bundle options = appWidgetManager.getAppWidgetOptions(widgetId);

    int maxW = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
    int maxH = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);

    int minW = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
    int minH = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);

    if ( context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ) {
        w = maxW;
        h = minH;
    } else {
        w = minW;
        h = maxH;
    }
}

Ответ 2

Посмотрите на метод:

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

Он будет вызываться каждый раз, когда вы запускаете/изменяете размер виджета.

Получение ширины/высоты виджета можно сделать следующим образом:

newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)
newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)
newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)

Сообщите мне, если это ответит на ваш вопрос.

Ответ 3

В настоящее время я использую это, надеюсь, что это поможет

private void run() {

    int width = 400, height = 400;

    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bitmap);

    Paint p = new Paint();
    p.setColor(Color.WHITE);
    p.setStyle(Paint.Style.STROKE);
    p.setStrokeWidth(1);
    p.setAntiAlias(true);

    c.drawCircle(width/2, height/2, radius, p);

    remoteViews.setImageViewBitmap(R.id.imageView, bitmap);

    ComponentName clockWidget = new ComponentName(context,
    Clock_22_analog.class);
    AppWidgetManager appWidgetManager = AppWidgetManager
    .getInstance(context);
    appWidgetManager.updateAppWidget(clockWidget, remoteViews);
}

Ответ 4

вы можете использовать этот

Bitmap image1, image2;

Bitmap bitmap = Bitmap.createBitmap(image1.getWidth(), image1.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);

надеюсь, что это поможет.:)

Ответ 5

u может создавать пользовательский виджет.. и устанавливать размер wight на свой метод onMeasure().. и также сохранять размер в это время, чтобы вы могли использовать его далее для создания образа. Хоп

Ответ 6

Я не работал над Widgets, но у меня есть некоторый опыт получения размера ImageView.

Вот какой код я использую:

public class ViewSizes {
    public int width;
    public int height;

    public boolean isEmpty() {
        boolean result = false;
        if (0 >= width || 0 >= height) {
            result = true;
        }
        return result;
    }
}

Это просто фиктивный класс, содержащий параметры размера.

public static ViewSizes getSizes(View view) {
        ViewSizes sizes = new ViewSizes();
        sizes.width = view.getWidth();
        sizes.height = view.getHeight();

        if (sizes.isEmpty()) {
            LayoutParams params = view.getLayoutParams();
            if (null != params) {
                int widthSpec = View.MeasureSpec.makeMeasureSpec(params.width, View.MeasureSpec.AT_MOST);
                int heightSpec = View.MeasureSpec.makeMeasureSpec(params.height, View.MeasureSpec.AT_MOST);
                view.measure(widthSpec, heightSpec);
            }

            sizes.width = view.getMeasuredWidth();
            sizes.height = view.getMeasuredHeight();
        }

        return sizes;
    }

Этот метод вычисляет ширину, заставляющую цикл измерения, если таковой еще не был.

public static boolean loadPhoto(ImageView view, String url, float aspectRatio) {
    boolean processed = false;
    ViewSizes sizes = ViewsUtils.getSizes(view);

    if (!sizes.isEmpty()) {
        int width = sizes.width - 2;
        int height = sizes.height - 2;
        if (ASPECT_RATIO_UNDEFINED != aspectRatio) {
            if (height * aspectRatio > width) {
                height = (int) (width / aspectRatio);
            } else if (height * aspectRatio < width) {
                width = (int) (height * aspectRatio);
            }
        }

        // Do you bitmap processing here

        processed = true;
    }

    return processed;
}

Этот, вероятно, бесполезен для вас. Я приведу только как пример - у меня есть ImageView и url изображения, который должен быть параметризован с изображением и высотой.

public class PhotoLayoutListener implements OnGlobalLayoutListener {
    private ImageView view;
    private String url;
    private float aspectRatio;


    public PhotoLayoutListener(ImageView view, String url, float aspectRatio) {
        this.view = view;
        this.url = url;
        this.aspectRatio = aspectRatio;
    }

    boolean handled = false;
    @Override
    public void onGlobalLayout() {
        if (!handled) {
            PhotoUtils.loadPhoto(view, url, aspectRatio);   
            handled = true;
        }

        ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
        if (viewTreeObserver.isAlive()) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                removeLayoutListenerPre16(viewTreeObserver, this);
            } else {
                removeLayoutListenerPost16(viewTreeObserver, this);
            }
        }
    }

    @SuppressWarnings("deprecation")
    private void removeLayoutListenerPre16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
        observer.removeGlobalOnLayoutListener(listener);
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void removeLayoutListenerPost16(ViewTreeObserver observer, OnGlobalLayoutListener listener){
        observer.removeOnGlobalLayoutListener(listener);
    }
}

Это только приемник макета - я хочу обработать загрузку изображения после завершения этапа компоновки.

public static void setImage(ImageView view, String url, boolean forceLayoutLoading, float aspectRatio) {
    if (null != view && null != url) {
        final ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();

        if (forceLayoutLoading || !PhotoUtils.loadPhoto(view, url, aspectRatio)) {
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.addOnGlobalLayoutListener(new PhotoLayoutListener(view, url, aspectRatio));
            }
        }
    }
}

Это метод, который я действительно вызываю. Я даю ему представление и URL. Методы заботятся о загрузке - если он может определить размер представления, он сразу начинает загружаться. В противном случае он просто назначает слушателя макета и запускает процесс загрузки после завершения макета.

Вы можете удалить некоторые параметры - forceLoading/aspectRatio не будет иметь для вас значения. После этого измените метод PhotoUtils.loadPhoto, чтобы создать растровое изображение с рассчитанной шириной/высотой.

Ответ 8

как сказал Джулиан, вы можете получить их так, как растровое изображение.

int width = bitmap.getWidth();
int height = bitmap.getHeight();