JavascriptProva

mercoledì 17 maggio 2017

Immagine tonda fluttuante sullo schermo

Immagine rotonda fluttuante sullo schermo.

MainActivity.java:
public class MainActivity extends Activity {


    Button button;
    Button button2;
    Button button3;
    ImageView imageView;
    RelativeLayout mainLayout;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=(Button)findViewById(R.id.button);
        button2=(Button)findViewById(R.id.button2);
        button3=(Button)findViewById(R.id.button3);
        imageView=new ImageView(this);
        mainLayout=(RelativeLayout)findViewById(R.id.activity_main);


        Intent intent=new Intent(getApplicationContext(),ChatHeadService.class);
        startService(intent);

        button.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {

            }
        });
        
    }
}


RoundedImage.java:
public class RoundedImage extends ImageView{

    private Bitmap figura;
    private int radius;



    public RoundedImage(Context context, Bitmap figura, int radius){
        super(context);

        this.figura=figura;
        this.radius=radius;

        Bitmap bitmap=Bitmap.createBitmap(radius,radius,Bitmap.Config.ARGB_8888);

        Paint paint=new Paint();
        Canvas canvas=new Canvas(bitmap);
        canvas.drawCircle(bitmap.getWidth()/2,bitmap.getHeight()/2,bitmap.getWidth()/2,paint);

        Rect fromRect=new Rect(0,0,figura.getWidth(),figura.getHeight());
        Rect toRect=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

        canvas.drawBitmap(figura,fromRect,toRect,paint);

        setImageBitmap(bitmap);
    }
}


ChatHeadService.java:
public class ChatHeadService extends Service {

    WindowManager manager;
    WindowManager.LayoutParams params;
    RoundedImage image;

    int initialX,initialY,initialTouchX,initialTouchY;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate(){
        super.onCreate();
        System.out.println("TEST");
        manager=(WindowManager)getSystemService(WINDOW_SERVICE);

                params=new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );

        params.gravity= Gravity.TOP | Gravity.LEFT;
        params.x=100;
        params.y=100;

        image=new RoundedImage(this,
                BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo),
                100
        );

        manager.addView(image,params);


        image.setOnTouchListener(new View.OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        initialX=params.x;
                        initialY=params.y;
                        initialTouchX=(int)event.getRawX();
                        initialTouchY=(int)event.getRawY();
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        params.x=initialX+(int)(event.getRawX()-initialTouchX);
                        params.y=initialY+(int)(event.getRawY()-initialTouchY);
                        manager.updateViewLayout(image,params);
                        return true;
                }

                return false;
            }
        });
    }

}


POST SCRIPTUM: Ho scoperto che tutto questo è valido fino all'API 22.
Con la 23, Marshmallow, è più complicato avere il permesso di caricare un'immagine su WindowManager.

Ecco il codice, comunque:
public class MainActivity extends AppCompatActivity {

    WindowManager.LayoutParams params;
    WindowManager windowManager;
    ImageView imageView;
    Bitmap bitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView=new ImageView(this);

        windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
        bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.scrofalo);
        imageView.setImageBitmap(bitmap);

        params=new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );
        params.gravity= Gravity.TOP | Gravity.LEFT;

        if(Build.VERSION.SDK_INT>=23) {
            if (!Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent,0);

            }
            else{
                windowManager.addView(imageView, params);
            }
        }else {
            windowManager.addView(imageView, params);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        System.out.println("RESULT");

        if(Build.VERSION.SDK_INT>=23){
            if(Settings.canDrawOverlays(this)){
                windowManager.addView(imageView, params);
            }

        }


    }


}

Nessun commento:

Posta un commento