dispatchDraw пользовательского представления в FrameLayout рисует позади ранее определенных ImageViews

Как я могу убедиться, что линия, нарисованная на холсте в методе dispatchDraw, нарисована поверх других видов?

Различные вопросы / ответы здесь на stackru, казалось, адресовали проблему. Никто не работал для меня. Линия всегда проводится за другими объектами. Что я пробовал:

  • использование метода dispatchDraw вместо onDraw (ни сработало)
  • изменение порядка в методах рисования, рисование линий до и после вызова super.onDraw / super.dispatchDraw
  • Рисование в растровое изображение
  • установка моих изображений в качестве фона для моего пользовательского просмотра

Вот мой main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/FrameLayout_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.music.stringtuner.MainActivity">

    <ImageView
        android:id="@+id/imageView_StringsChart"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="false"
        android:background="@color/bluePrimary"
        android:contentDescription="@string/GuitarStringsContentDescription"
        android:cropToPadding="false"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_guitarstringsabstract"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp" />

    <ImageView
        android:id="@+id/imageView_notation"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/NotationContentDescription"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_scientific_notation" />

    <com.ui.line.vertical.VerticalLineDrawingView
        android:id="@+id/drawView_NoteIndicator"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@string/LineIndicatorContentDescription"
        android:textColor="@color/greenPrimary"
        android:textSize="12sp"
        android:scaleType="fitCenter" />

</FrameLayout>

Два вида изображения относятся к двум векторным рисуемым xml-файлам в моей папке ресурсов. Оба xml-файла имеют структуру

<vector xmlns:android="http://schemas.android.com/apk/res/android"
       android:width="180dp"
       android:height="300dp"
       android:viewportWidth="180.0"
       android:viewportHeight="300.0">
   <path
...

и состоят только из <path> элементы.

Мой пользовательский вид расширяет TextView и рисует вертикальную линию. Однако эта линия рисуется за элементами пути, определенными в xml-файлах. Как я могу убедиться, что линия нарисована сверху? Здесь мой пользовательский класс

package com.ui.line.vertical;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;

import android.support.v4.content.res.ResourcesCompat;

import com.music.stringtuner.R;

/**
 * Class extending view to draw a vertical line on the screen that can be repositioned.
 * Created by Jan on 07.04.2017.
 */

public class VerticalLineDrawingView extends android.support.v7.widget.AppCompatTextView {

    private static final String TAG = "VerticalLineDrawingView";

    private int position = 10;
    private Paint mLinePaint;
    private int screenHeight = 0;
    private int screenWidth = 0;

    public VerticalLineDrawingView(final Context ct) {
        super(ct);
        init();
    }

    public VerticalLineDrawingView(final Context ct, final AttributeSet attrs) {
        super(ct, attrs);
        init();
    }

    public VerticalLineDrawingView(final Context ct, final AttributeSet attrs, final int defStyle) {
        super(ct, attrs, defStyle);
        init();
    }

    private void init() {
        // Generate bitmap used for background

        mLinePaint = new Paint();
        mLinePaint.setColor(ResourcesCompat.getColor(getResources(), R.color.greenPrimary, null));
        mLinePaint.setStrokeWidth(1);

    }

/*
    @Override
    public void onDraw(final Canvas canv) {
        // background bitmap to cover all area
    }
*/

    @Override
    protected void dispatchDraw(Canvas canv) {
        canv.drawLine(position, 0, position, screenHeight, mLinePaint);
    }

    @Override
    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        screenHeight = getMeasuredHeight();
        screenWidth = getMeasuredWidth();
    }

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

    public void reposition(int newpos) {
        position   = newpos;
        invalidate();
    }

    public int getPosition() {
        return position;
    }

}

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

Я использую Android Studio 2.3.1

Спасибо заранее!

0 ответов

Другие вопросы по тегам