Intereting Posts
Захват экрана внешнего дисплея на Android? Как ускорить процесс компиляции Android Studio Загрузка файла через SSL с помощью клиентского сертификата и HttpsURLConnection от Android Android-приложение не может получить доступ к местоположению на эмуляторе, используя FusedLocationApi Как установить другой фон ключей для пользовательской клавиатуры Android Android-приложение, которое работает поверх всех других приложений? Запуск приложения в фоновом режиме, когда телефон в Doze Синхронизация времени для записи данных на нескольких устройствах Android RxJava + Дооснащение длинным опросом Как получить событие штрихового клика с горизонтальных диаграмм MPcharts в android? Как установить рынок Android на эмулятор для всех api's Java.lang.UnsupportedOperationException: это не поддерживается, используйте MenuItemCompat.setOnActionExpandListener () Android setUserVisibleHint никогда не вызывается? Рекомендации по работе с несколькими таблицами Лучший способ начать фрагменты

Пользовательский вид Android показывает сплошной черный цвет после вызова invalidate

В этом коде я хотел бы провести линию между вершиной двух ImageViews. Однако при запуске приложения пользовательский вид отображается сплошным черным после вызова invalidate() .

Вот мой код:

 public class ArrowView extends RelativeLayout { public Paint paint; public Bitmap eraser; public Canvas cacheCanvas; public float leftX; public float leftY; public float rightX; public float rightY; public boolean update = false; public ImageView iv_leftArrow; public ImageView iv_rightArrow; private int w; private int h; LayoutInflater mInflater; public ArrowView(Context context) { super(context); this.setWillNotDraw(false); mInflater = LayoutInflater.from(context); init(); } public ArrowView(Context context, AttributeSet attrs) { super(context, attrs); this.setWillNotDraw(false); mInflater = LayoutInflater.from(context); init(); } public ArrowView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.setWillNotDraw(false); mInflater = LayoutInflater.from(context); init(); } @Override public void onSizeChanged(int w, int h, int oldW, int oldH) { this.w = w; this.h = h; super.onSizeChanged(w, h, oldW, oldH); } public void init() { View v = mInflater.inflate(R.layout.arrow_view, this, true); paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLACK); paint.setStrokeWidth(5); v.setBackgroundColor(Color.TRANSPARENT); eraser = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); iv_leftArrow = (ImageView) v.findViewById(R.id.iv_leftarrow); iv_rightArrow = (ImageView) v.findViewById(R.id.iv_rightArrow); cacheCanvas = new Canvas(); cacheCanvas.setBitmap(eraser); } public void setCoordinates(float leftX, float leftY, float rightX, float rightY) { this.leftX = leftX; this.leftY = leftY; this.rightX = rightX; this.rightY = rightY; } @Override public void onDraw(Canvas c) { super.onDraw(c); setCoordinates(iv_leftArrow.getX() + iv_leftArrow.getWidth() / 2, iv_leftArrow.getY(), iv_rightArrow.getX() + iv_rightArrow.getWidth() / 2, iv_rightArrow.getY() ); if (update) { c.drawLine(leftX, leftY, rightX, rightY, paint); update = false; } cacheCanvas.drawPath(p, paint); } } 

Есть ли причина, почему пользовательский вид отображается как сплошной черный после вызова invalidate() ?

Solutions Collecting From Web of "Пользовательский вид Android показывает сплошной черный цвет после вызова invalidate"

Как правило, система обрабатывает изменения размера, скрытия, отображения и тонны других вещей для ваших виджетов автоматически, но иногда имеет проблемы, если базовый буфер для рисованных пикселей или данных резервного копирования изменился или устарел (вы меняете ресурс изображения на View или Изменяется исходный набор данных). Это происходит потому, что ОС не знает, что данные изменились определенным образом.

В этих случаях, когда вы имеете дело с рисунком, вы должны сообщить системе, что ее базовые данные не находятся в хорошем состоянии с Widget.invalidate (), и повторный рисунок попадает в очередь на основной поток, как вы упомянули. В зависимости от реализации системы и версии Android отслеживание изменений в системе меняется, но то, что я обычно делаю, предполагает, что системные ресурсы (массивы байтов, массивы символов, индексы ресурсов, ручное рисование по контексту) не отслеживаются и нуждаются в недействительности И все остальное будет обрабатываться системой.

Источник: Когда необходимо выполнить invalidate () в представлении?

Как вы знаете, invalidate () используется для обновления вида вызовом onDraw .

Я думаю, что вы делали это, прежде чем устанавливать обновление в true, поэтому ваш метод onDraw запускался с ложным обновлением звуками.