Я создал собственное представление, расширенное из класса представления.Он загружается очень хорошо, если я звоню
setContentView(new Customview());
Однако он не будет загружаться из файла макета XML.Я не уверен, что я делаю здесь неправильно.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ThumbnailTest">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="36dp"
android:layout_marginTop="16dp"
android:text="Hello World!"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.example.christopher.thumbnailtest.ThumbnailFrame
class="com.example.christopher.thumbnailtest.ThumbnailFrame"
id="@+id/ThumbnailFrame"
android:layout_width="265dp"
android:layout_height="230dp"
android:layout_marginStart="60dp"
android:layout_marginTop="112dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Это просто простой круг, вот и все, что я пытаюсь нарисовать.
РЕДАКТИРОВАТЬ: Вот класс пользовательского представления.Теперь вызывается класс представления, но круг не печатает круг на экране.Первые два параметра метода drawCircle()
были очень высокими (сообщается из журнала отладки ЧТО), но я разделил числа, чтобы свести их к минимуму, и они все равно ничего не показали.Это похоже на то, что функция не будет рисовать объект на холсте, когда он загружен как вид из файла макета.
public class ThumbnailFrame extends View {
private Paint thumbnailPaint;
private Canvas thumbnailCanvas;
private float xMax;
private float yMax;
private float xMin;
private float yMin;
private float PositX;
private float PositY;
private float radius;
public ThumbnailFrame(Context context, AttributeSet attrs) {
super(context, attrs);
thumbnailPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
thumbnailPaint.setStyle(Paint.Style.STROKE);
thumbnailPaint.setColor(Color.YELLOW);
//Default radius
radius = 20;
}
@Override
protected void onSizeChanged(int w,
int h,
int oldw,
int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.d("FRAME_CALLED", "I'm called!");
float xpad = (float)(getPaddingLeft() + getPaddingRight());
float ypad = (float)(getPaddingTop() + getPaddingBottom());
float ww = (float)w - xpad;
float hh = (float)h - ypad;
xMax = ww - radius;
xMin = ww + radius;
yMax = hh - radius;
yMin = hh + radius;
PositX = ww/2;
PositY = hh/2;
}
public void redraw() {
Log.d("THUMBNAIL_CALLED", "Am I called?");
//Make sure our circle does not leave the bounds of our screen.
if (PositX > xMax) {
PositX = xMax;
}
if (PositX < xMin) {
PositX = xMin;
}
if (PositY > yMax) {
PositY = yMax;
}
if (PositY < yMin) {
PositY = yMin;
}
Log.d("WHAT", String.valueOf(PositX) + ":" + String.valueOf(PositY) + ":" + String.valueOf(radius) + ":" + thumbnailPaint.toString());
thumbnailCanvas.drawCircle(PositX, PositY, 100, thumbnailPaint);
}
public void setRadius(float value) {
radius = value;
}
public void setFrameX(float x) {
PositX = x;
}
public void setFrameY(float y) {
PositY = y;
}
public void removeFrame() {
thumbnailCanvas.save();
thumbnailCanvas.restore();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.d("THUMBNAIL_CALLED", "Am I called?");
thumbnailCanvas = canvas;
redraw();
}
}