OnDraw пользовательского представления получает холст с различными размерами

1

У меня есть класс, полученный из ImageView:

public class TouchView extends ImageView
{
   @Override
   protected void onDraw(Canvas canvas)
   ...

Сенсорное окно создается только один раз в действии onCreate и заполняется с помощью извлекаемого из файла SVG.

ImageView imageView = new TouchView(this);
imageView.setScaleType(ImageView.ScaleType.MATRIX);
FrameLayout f = (FrameLayout)findViewById(R.id.frame2);
FrameLayout.LayoutParams l = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT);
f.addView(imageView, l);
...
is = openFileInput(svgname);
svg = SVGParser.getSVGFromInputStream(is);
is.close();

Drawable d = svg.createPictureDrawable();
imageView.setImageDrawable(d);

Вся окружающая среда остается неизменной все время. Однако в методе onDraw я получаю холст разных размеров между событиями. Это код:

protected void onDraw(Canvas canvas)
{
  super.onDraw(canvas);
  Log.v("DRAW", " w= " + canvas.getWidth() + " h=" + canvas.getHeight());
  ...
}

производит журналы с линиями, где ширина и высота холста изменяются взад и вперед от обычного 1024 * 728 (это правильное размерное изображение на планшете) до 200 * 160 (странная вещь, представляющая ошибки на моих рисунках). Я смущен.

Должно ли холст всегда иметь одинаковый размер для одного и того же вида/чертежа? В документации говорится, что методы getWidth и getHeight возвращают размеры текущего слоя чертежа, но не ясно, что такое слой, сколько из них создано для холста "за сценой" и как управлять этим процессом.

Я был бы признателен за любое объяснение того, как добиться единообразного поведения рисунка, в частности, путем получения фактического размера вида, раскрашенного в onDraw.

В настоящее время я использую workround с вызовом view getDrawingRect, но я не уверен, что это правильный способ, потому что кажется, что параметр canvas onDraw должен быть полностью достаточным для рисования размеров.

Теги:
android-canvas
ondraw

1 ответ

0

У меня была такая же проблема, вот как я получил это исправление, надеюсь, что это поможет вам

protected void onDraw(Canvas c) {
    super.onDraw(c);
    int w = getWidth(), h = getHeight();
    // resize
Matrix resize = new Matrix();
resize.postScale((float)Math.min(w, h) / (float)mMarker.getWidth(), (float)Math.min(w, h) / (float)mMarker.getHeight());
imageScaled = Bitmap.createBitmap(mMarker, 0, 0, mMarker.getWidth(), mMarker.getHeight(), resize, false);

c.drawBitmap(imageScaled, 0,0, paint);

}

Где mMarker определяется в пользовательском конструкторе ImageView.

...
private Bitmap mMarker, imageScaled;
Paint paint = new Paint();


//Java constructor
public AvatarImageView(Context context) {
    super(context);
    init();
}

//XML constructor
public AvatarImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    // load the image only once
    mMarker = BitmapFactory.decodeResource(getResources(), R.drawable.silhouette_48);
    mMarker.setHasAlpha(true);paint.setColor(Color.WHITE);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(4);

    //invalidate(); // don't know if I need this
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню