EDIT:
ОК, поэтому я увеличил длину и ширину представления на большую часть экрана. Я могу предположить, что метод 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 layout WORKS.
Вот код для моего пользовательского представления. Как я уже говорил, строки, содержащие запись, попадают, но мой холст пуст:
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");
}
}
Подобный код работает просто отлично для меня, включая анимацию. У вас есть еще одна проблема в другом месте вашего кода: попробуйте установить стиль рисования.
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setTextSize(30);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
onDraw()
(просто нарисуйте круг или линию), попробуйте очистить холст перед его использованием, попробуйте добавить протоколирование (в частности, чтобы проверить значенияcenterX
иcenterY
)