Android Question Keeping ripple effect within rounded panel

Marvel

Active Member
Licensed User
I have been trying to use the ripple effect library inside a rounded panel, the ripple keeps going out out the corners. I also tried using Erels halo animation example but I still get the same effect.

Is there any solution to this?

GIF-200717_002110.gif
 
To keep the wave effect inside the panel, you need to adjust this:

Use: B4A,B4J and B4I

Dim InnerRadius As Int = Max(Parent.Width, Parent.Height) * 1.20
or
Dim InnerRadius As Int = Max(Parent.Width, Parent.Height)

B4X: Copy
Public Sub RippleEffect (Parent As B4XView, Color As Int, Duration As Int)
    Dim cvs As B4XCanvas
    Dim p As B4XView = xui.CreatePanel("")
    Dim InnerRadius As Int = Max(Parent.Width, Parent.Height) * 1.20
    p.SetLayoutAnimated(0, 0, 0, InnerRadius, InnerRadius)
    cvs.Initialize(p)
    cvs.DrawCircle(cvs.TargetRect.CenterX, cvs.TargetRect.CenterY, cvs.TargetRect.Width / 2, Color, True, 0)
    cvs.Invalidate
    cvs.Release
    Dim bmp As B4XBitmap = cvs.CreateBitmap
    p.RemoveViewFromParent
    Dim iv As ImageView
    iv.Initialize("")
    Dim p As B4XView = iv
    Dim Radius As Int = InnerRadius/2
    Dim x As Int = Parent.Width/2
    Dim y As Int = Parent.Height/2
    p.SetBitmap(bmp)
    Parent.AddView(p, x, y, 0, 0)
    p.SetLayoutAnimated(Duration , x - Radius, y - Radius, Radius * 2, Radius * 2)
    p.SetVisibleAnimated(Duration , False)
    Sleep(Duration )
    p.RemoveViewFromParent
End Sub

Sample in B4J:
 

Attachments

Last edited:
Upvote 0
To keep the wave effect inside the panel, you need to adjust this:

Use: B4A,B4J and B4I


or


B4X: Copy
Public Sub RippleEffect (Parent As B4XView, Color As Int, Duration As Int)
    Dim cvs As B4XCanvas
    Dim p As B4XView = xui.CreatePanel("")
    Dim InnerRadius As Int = Max(Parent.Width, Parent.Height) * 1.20
    p.SetLayoutAnimated(0, 0, 0, InnerRadius, InnerRadius)
    cvs.Initialize(p)
    cvs.DrawCircle(cvs.TargetRect.CenterX, cvs.TargetRect.CenterY, cvs.TargetRect.Width / 2, Color, True, 0)
    cvs.Invalidate
    cvs.Release
    Dim bmp As B4XBitmap = cvs.CreateBitmap
    p.RemoveViewFromParent
    Dim iv As ImageView
    iv.Initialize("")
    Dim p As B4XView = iv
    Dim Radius As Int = InnerRadius/2
    Dim x As Int = Parent.Width/2
    Dim y As Int = Parent.Height/2
    p.SetBitmap(bmp)
    Parent.AddView(p, x, y, 0, 0)
    p.SetLayoutAnimated(Duration , x - Radius, y - Radius, Radius * 2, Radius * 2)
    p.SetVisibleAnimated(Duration , False)
    Sleep(Duration )
    p.RemoveViewFromParent
End Sub

Sample in B4J:
Thanks for this code, it solves most of my problem. The only thing is that it always starts in the centre of the view. when I modify it to start exactly at the touch coordinates I still get the same effect. Probably because this code only makes sure the ripples disappear before it gets to the edge of the view, but when the ripple starts close to the edge of the view it reaches the edge before it can disappear.
 
Upvote 0
For the waves to start from where you clicked, you must send x, y and calculate the radius.

This is a basic example to understand the use of canvases and animations.

regards
 
Upvote 0
You can create a class to create waves in the label, image view, etc.
for the button type it is more complex.

Regards,
 
Upvote 0
Please take a look here
 
Upvote 0
Back
Top