Мой пользовательский вид не загружается - PullRequest
0 голосов
/ 24 июня 2018

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

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();
    }

}

1 Ответ

0 голосов
/ 24 июня 2018

Ваш код работает так, как вы написали.Вы просто не видите желтый на белом, потому что он имеет небольшую ширину.Я предлагаю добавить thumbnailPaint.setStrokeWidth(10f/*or what you want*/); в конструктор:

 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);
        thumbnailPaint.setStrokeWidth(10f);

        //Default radius
        radius = 20;

    }

также вы должны изменить макет с:

<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" />

на:

<com.example.christopher.thumbnailtest.ThumbnailFrame
        android: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" />

Также вы должны позвонить setContentView(R.layout.activity_main/*your id*/); вместо setContentView(new Customview());

После этого вы можете увидеть:

enter image description here

...