I'm trying to use the FILTER_BITMAP_FLAG while drawing bitmaps on a canvas. When the image is scaled, bilinear sampling should be used to blur the whole image. This doesn't work for me on two Android 11 devices. On Android 7, the image is drawn correctly with blurred pixels (see attached images).
The documentation states the following but I'm not sure what to do with this information:
"On devices running Build.VERSION_CODES#O and below, hardware accelerated drawing always uses bilinear sampling on scaled bitmaps, regardless of this flag. On devices running Build.VERSION_CODES#Q and above, this flag defaults to being set on a new Paint. It can be cleared with setFlags(int) or setFilterBitmap(boolean)."
This is the code (B4XPages example attached):
Does anyone have an idea about how to fix this and get the bilinear sampling?
The documentation states the following but I'm not sure what to do with this information:
"On devices running Build.VERSION_CODES#O and below, hardware accelerated drawing always uses bilinear sampling on scaled bitmaps, regardless of this flag. On devices running Build.VERSION_CODES#Q and above, this flag defaults to being set on a new Paint. It can be cleared with setFlags(int) or setFilterBitmap(boolean)."
This is the code (B4XPages example attached):
B4X:
Sub Class_Globals
Private Root As B4XView
Private xui As XUI
Private Panel1 As Panel
Private Canvas1 As Canvas
Private refl As Reflector
End Sub
Public Sub Initialize
' B4XPages.GetManager.LogEvents = True
End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
Root.LoadLayout("MainPage")
Canvas1.Initialize(Panel1)
SetAntiAlias(Canvas1, False)
Dim bmp1 As Bitmap = LoadBitmap(File.DirAssets, "TestImage.png")
Dim rect1 As Rect
rect1.Initialize(0dip, 0dip, Panel1.Width, Panel1.Width)
Canvas1.DrawBitmap(bmp1, Null, rect1)
End Sub
Sub SetAntiAlias (c3 As Canvas, bOn As Boolean)
c3.AntiAlias = bOn
Dim iSetBits As Int = 3 ' ANTI_ALIAS_FLAG | FILTER_BITMAP_FLAG
Dim iClearBits As Int = 3
If bOn = True Then
iClearBits = 0
Else
iSetBits = 0
End If
Dim NativeCanvas As Object
refl.Target = c3
NativeCanvas = refl.GetField("canvas")
Dim PaintFlagsDrawFilter As Object
PaintFlagsDrawFilter = refl.CreateObject2("android.graphics.PaintFlagsDrawFilter", Array As Object(iClearBits, iSetBits), Array As String("java.lang.int", "java.lang.int"))
refl.Target = NativeCanvas
refl.RunMethod4("setDrawFilter", Array As Object(PaintFlagsDrawFilter), Array As String("android.graphics.DrawFilter"))
End Sub
Does anyone have an idea about how to fix this and get the bilinear sampling?