2

I have created am overlay floating icon using a service which is visible over any application. I have implemented it as follow: http://www.piwai.info/chatheads-basics/

Now what I want is that when a user drags this overlay icon in any direction a rectangle should be drawn along with it starting from the initial positon of the overlay icon to its new position. I tried creating a resizable rectangle using canvas and adding it to windowmanager but I am unable to resize it when it gets added to the window.

So in short this is what I want to achieve:

1>User press the overlay icon at positon say (x1,y1)

2>User drags the overlay icon to positon say (x2,y2)

3>A rectangle is created as the user drags the overlay icon from (x1,y1) to (x2,y2).

I have already seen this and this.

This is what I have tried so far:

    public class MyService extends Service
{
   .....
    public void onCreate()
    {
        super.onCreate();
        floatingFaceBubble = new ImageView(this);
        floatingFaceBubble.setImageResource(R.mipmap.ic_launcher);
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        final LayoutParams myParams = new WindowManager.LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT,
                LayoutParams.TYPE_PHONE,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);
        myParams.gravity = Gravity.TOP | Gravity.START;
        myParams.x = 0;
        myParams.y = 100;
        windowManager.addView(floatingFaceBubble, myParams);

        try
        {          
            floatingFaceBubble.setOnTouchListener(new View.OnTouchListener()
            {                
                private int initialX;
                private int initialY;
                private float initialTouchX;
                private float initialTouchY;
                private long touchStartTime = 0;

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {                                   
                    switch (event.getAction())
                    {
                        case MotionEvent.ACTION_DOWN:
                            touchStartTime = System.currentTimeMillis();
                            initialX = myParams.x;
                            initialY = myParams.y;
                            initialTouchX = event.getRawX();
                            initialTouchY = event.getRawY();
                            floatingFaceBubble.setVisibility(View.INVISIBLE);

                            rectangleview=new RectangleView(getApplicationContext(),initialTouchX,initialTouchY,event.getRawX(),event.getRawY());                           
                            windowManager.addView(rectangleview,myParams);                                                  

                           break;
                        case MotionEvent.ACTION_UP:   //this case will be executed when button(image) is released                          
                            break;
                        case MotionEvent.ACTION_MOVE:   //this case will be executed when button(image) is moved
                               floatingFaceBubble.setVisibility(View.VISIBLE);
                               myParams.x = initialX + (int) (event.getRawX() - initialTouchX);
                               myParams.y = initialY + (int) (event.getRawY() - initialTouchY);                          
                               windowManager.updateViewLayout(v, myParams);
                               break;}}}}}

This is my Rectangleview:

public class RectangleView extends View
{
    Paint paint = new Paint();  
    float pointX;
    float pointY;
    float startX;
    float startY;

    public RectangleView(Context context,float x1,float y1,float x2,float y2)
    {
        super(context);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.RED);     

        startX=x1;
        startY=y1;
        pointX=x2;
        pointY=y2;    }


    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        pointX = event.getX();
        pointY = event.getY();
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                startX = pointX;
                startY = pointY;
                return true;
            case MotionEvent.ACTION_MOVE:
                pointX=event.getX();
                pointY=event.getY();
                break;
            default:
                return false;
        }
// Force a view to draw again
        postInvalidate();
        return true;
    }

    @Override
    public void onDraw(Canvas canvas)
    {     
        canvas.drawRect(startX, startY, pointX, pointY,paint);
    }
}
Community
  • 1
  • 1
v3rt1ag0
  • 785
  • 1
  • 8
  • 22

0 Answers0