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
Спасибо заранее!