Просмотр в Android на весь экран - как указать холсту соблюдать ограничения просмотра?

РЕДАКТИРОВАТЬ:

ОК, поэтому я увеличил длину и ширину представления на большую часть экрана. Я могу предположить, что метод onDraw() НЕ ПРИНИМАЕТ пределы представления, потому что он проходит через весь экран, как я могу. предполагать. Итак, теперь вопрос будет заключаться в том, как указать холсту соблюдать ограничения представления? Есть идеи, может быть, принудительно установить некоторые параметры?

КОНЕЦ РЕДАКТИРОВАНИЯ

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

Как правильно реализовать отрисовку для пользовательских представлений и что не так с тем, что я сделал ниже?

Мой пользовательский вид, который находится внутри такого макета:

<?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1" android:layout_height="fill_parent"
android:layout_width="fill_parent">

<pis.core.JMI_VistaMenuIn android:layout_height="150dip" android:layout_width="150dip" android:layout_alignParentTop="true" android:id="@+id/viewAnd01" ></pis.core.JMI_VistaMenuIn>

<Button android:layout_width="wrap_content" android:id="@+id/btnJugar" android:layout_height="wrap_content" android:text="Jugar" android:layout_below="@+id/viewAnd01" android:layout_alignLeft="@+id/viewAnd01" android:layout_alignRight="@+id/viewAnd01"></Button>

</RelativeLayout> 

Пользовательский вид называется: pis.core.JMI_VistaMenuIn. В предварительном просмотре я получил «java.lang.UnsupportedOperationException», но когда загружается .apk, макет xml РАБОТАЕТ.

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

public class JMI_VistaMenuIn extends View {

public static final String QUOTE = "Mind Logic+";

public Animation anim;

//Default constructors

public void createAnim(Canvas canvas) {
    Log.i("SC", "Exe canvas 01");
    anim = new RotateAnimation(0, 360, canvas.getWidth() / 2, canvas
            .getHeight() / 2);
    anim.setRepeatMode(Animation.REVERSE);
    anim.setRepeatCount(Animation.INFINITE);
    anim.setDuration(10000L);
    anim.setInterpolator(new AccelerateDecelerateInterpolator());

    startAnimation(anim);
}

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    // creates the animation the first time
    if (anim == null) {
        createAnim(canvas);
    }

    Path circle = new Path();

    int centerX = canvas.getWidth() / 2;
    int centerY = canvas.getHeight() / 2;
    int r = Math.min(centerX, centerY);

    circle.addCircle(centerX, centerY, r, Direction.CW);
    Paint paint = new Paint();
    paint.setColor(Color.BLUE);
    paint.setTextSize(30);
    paint.setAntiAlias(true);

    canvas.drawTextOnPath(QUOTE, circle, 0, 30, paint);
    Log.i("SC", "Exe canvas 02");
}
}

person Community    schedule 13.07.2011    source источник
comment
@Joel: я попытался отредактировать ваш вопрос, чтобы было более очевидно, о чем вы спрашиваете. Людей, как правило, привлекают вопросы, которые они уже знают, как решить, и я уверен, что люди сталкивались с этой проблемой раньше :) Не стесняйтесь откатывать или улучшать ее, если вам не нравятся мои изменения.   -  person Merlyn Morgan-Graham    schedule 14.07.2011
comment
Несколько советов: попробуйте сделать что-то менее навороченное в методе onDraw() (просто нарисуйте круг или линию), попробуйте очистить холст перед его использованием, попробуйте добавить ведение журнала (в частности, чтобы проверить значения centerX и centerY)   -  person Guillaume Brunerie    schedule 14.07.2011
comment
@Guillaume Brunerie: Ну, это частично сработало, я нарисовал один, но он просто показывает небольшую часть полного круга, и он проходит через весь экран. Это реально сводит меня с ума!!!!   -  person    schedule 14.07.2011


Ответы (1)


Подобный код у меня отлично работает, включая анимацию. У вас есть еще одна проблема где-то еще в вашем коде: попробуйте установить стиль рисования.

Paint paint = new Paint();
    paint.setColor(Color.BLUE);
    paint.setTextSize(30);
    paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
person Femi    schedule 13.07.2011
comment
Я добавил этот LOC, но я все еще сталкиваюсь с той же проблемой, и я просто не знаю, где еще искать, я много времени наблюдал за одними и теми же строками. Может быть, манифест как-то связан со всем этим? - person ; 14.07.2011
comment
Вы пробовали это на нескольких устройствах? Возможно, другой эмулятор или реальное устройство? Я протестировал его на Nexus 1, и он отлично работает. - person Femi; 14.07.2011
comment
Я только что попробовал 3 разных эмулятора, ничего. Может быть, вы можете поделиться своим кодом с сообществом? Это довольно хлопотно, я видел множество сообщений по этой теме без какого-либо решения. - person ; 14.07.2011