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);
}
}
}
}