Получение размера изображения для создания растрового изображения - PullRequest
18 голосов
/ 26 февраля 2012

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

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

послея знаю, что могу сделать это с помощью Canvas, imageviews и Bitmaps.

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

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

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

Ответы [ 8 ]

2 голосов
/ 31 января 2014

Из того, что я узнал, вы можете рассчитывать размеры виджетов только на 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 голосов
/ 20 марта 2014

Взгляните на метод:

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)

Дайте мне знать, если это ответит на ваш вопрос.

0 голосов
/ 20 марта 2014

Я не работал над виджетами, но у меня есть некоторый опыт получения размера 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, чтобы создать растровое изображение с шириной / высотой, которое оно рассчитало.

0 голосов
/ 02 марта 2014

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

0 голосов
/ 22 февраля 2014

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

Bitmap image1, image2;

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

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

0 голосов
/ 20 февраля 2014

Я сейчас использую это, надеюсь, это поможет

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);
}
0 голосов
/ 27 февраля 2012

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

int width = bitmap.getWidth();
int height = bitmap.getHeight();
0 голосов
/ 27 февраля 2012

Вот учебники, которые вы должны пройти, все четко дано для: Разработка виджетов домашнего экрана Android

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