Как использовать onDraw () поверх XML-макета? Недопустимо не обновлять функцию onDraw () - PullRequest
0 голосов
/ 10 мая 2018

Я пытался нарисовать круги как позиции игроков на карте, но я хочу использовать XML для разметки других вещей вокруг разметки, таких как кнопки, с картой в качестве фона.Однако я не могу заставить обе вещи работать вместе.Они отлично работают в отдельности, а содержимое отображается нормально, если я использую пользовательский класс представления в качестве setContentView.Но если я использую настраиваемое представление в xml, функция onDraw () запускается только один раз при запуске и не может быть недействительной () 'd.

Это XML-макет:

<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=".TrackMap">
<com.b143lul.android.logreg.CircleView android:id="@+id/CircleView"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/resized_track_2"
    ></com.b143lul.android.logreg.CircleView>

И мой код в настраиваемом представлении:

public class CircleView extends View {
    SharedPreferences sharedPreferences;
    JSONObject groupScores;
    Paint paint1;
    String localUsername = "";
    public CircleView(Context context) {
        super(context);
        init(context);
    }
    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    public void init(Context context) {
        paint1 = new Paint();
        paint1.setColor(Color.BLUE);
        this.setWillNotDraw(false);
    }
    protected void onDraw(Canvas canvas) {
        // Bunch of circle drawing.
    }

    public void update(JSONObject allGroupScores, String username) {
        groupScores = allGroupScores;
        localUsername = username;
        invalidate();
        // Invalidate being used to refresh the draw function
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

Что касается того, как я реализую настраиваемое представление, я запускаю в onCreate ():

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    circleView = new CircleView(this);
    //setContentView(circleView);
    setContentView(R.layout.activity_track_map);

И затем обновлениеФункция класса customview вызывается после StringRequest, который получает оценки каждые 5 секунд (что работает все отлично):

try {
        groupScores = new JSONObject(response);
        circleView.update(groupScores, username);

Итак, мне просто интересно, как я могу использовать оба сразу, такчто рисунок идет поверх XML.К сожалению, я не могу найти что-то об этом в Интернете, и мне жаль, если это что-то действительно глупое, я не делаю!Заранее спасибо!:)

Просто упомянуть: функция update () выполняется, но invalidate() не выполняет обновление onDraw ().Это выполняется, если это представление используется как setContentView ().

1 Ответ

0 голосов
/ 11 мая 2018

Получается,

circleView = new CircleView (this);

загружает класс вне XML, что было частью проблемы. Однако, когда я попытался загрузить представление с помощью findViewById (), я получил исключение NullPointerException. Итак, setContentView ({Ваш макет XML}) должен быть вызван перед попыткой получить класс по представлению. АКА решение:

setContentView(R.layout.activity_track_map);
circleView = (CircleView)findViewById(R.id.CircleView);
...