2015-01-29 6 views
0

У меня есть пользовательский вид. Я создаю в полноэкранном режиме прозрачного наложения, используя полный экран прямоугольник вызова этого метода в OnDraw:Рисование с использованием холста - Очистить назначение

private void drawOverlay(Canvas canvas) { 
     canvas.drawRect(0, 0, this.getWidth(), this.getMeasuredHeight(), backgroundPaint); 
    } 

Мой экран теперь накладывается с прозрачным фоном я, определенной ранее.

Теперь, я хочу нарисовать Drawable на экране. На чертеже могут быть прозрачные части. Это может быть, например, форма, определяемая следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval"> 

    <solid android:color="@color/transparent"></solid> 
    <stroke android:width="10dp" android:color="#ffff0716"/> 
</shape> 

Теперь я хочу нарисовать это на экране. Я рисую его, используя этот метод:

private void drawDrawableOverTargetView(Canvas canvas) { 
     Rect rect = new Rect(200, 200, 450, 400); //TODO 
     Drawable drawable = tutorial.getHighlightDrawable(); 
     drawable.setBounds(rect); 
     drawable.draw(canvas); 
    } 

Внутренняя часть моего овала определена прозрачно в xml. Когда отображается, внутренняя часть овала будет цветом наложения, потому что прямоугольник наложения находится ниже него. Вопрос: Можно ли определить, что drawable должен переопределять цвет фона прямоугольника, что означает, что внутренняя его часть становится прозрачной? Можно ли удалить часть прямоугольника наложения, которая ниже моей?

Я попытался с помощью

drawable.setColorFilter(Color.Transparent, PorterDuff.Mode.Clear); 

Но это, кажется, не работает:/

ответ

1

Вы делаете это способ сложнее, чем вам нужно. Холсты поддерживают то, что на них, в пикселях, а не объектах. Когда часть этого холста недействительна, он называет все требуемые коды рисования и запрашивает новые пиксели. Просто скопируйте его так, чтобы он рисовал так, как вам хотелось бы, и аннулируйте область. Он снова вызовет процедуру рисования и поместит их в том порядке, в котором вы их рисуете.

Холст не помнит цвет фона под объектами, потому что есть только пиксели, а не объекты. Единственный смысл, в котором есть объекты, - это то, где вы рисуете возражения, что вызывает рендеринг этого на холсте. Но вы не можете его удалить. Однако вы можете объявить область, в которой этот объект был отображен как недопустимый, и при обновлении не нарисовать этот объект при следующем вызове.

Просто убедитесь, что вы вызываете материал в том порядке, который хотите, так как вы хотите изменить код, нарисуйте его в этом порядке.

Вы не можете изменить материал, уже присутствующий на экране после факта, за исключением одной операции смешивания, операции Porter-Duff просто касаются всех логических способов управления пикселями на экране. CLEAR, например, восстановит эту область до чистой прозрачности. Что в основном просто очищает этот раздел экрана. На экране нет круга. Вы пишете прозрачные пиксели с набором пикселей, которые выглядят как круг. Не делай этого. Когда вы не хотите, чтобы этот объект круга, объявите изображение недействительным и когда он снова вызовет процедуру рисования, не рисуйте этот круг.

После того, как вы нарисованы, вы изменяете пиксели, а не вещи.

Смежные вопросы