У меня есть класс, производный от 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
.
В настоящее время я использую обходной путь с вызовом getDrawingRect представления, но я не уверен, что это правильный способ, потому что кажется, что параметра canvas
для onDraw
должно быть достаточно для определения размера чертежа.