JavascriptProva

venerdì 9 novembre 2018

Salvataggio floatingView e removeView (immagini in overlay)

Le strade si dividono: da una parte, l'apprendimento teorico di tutto il sistema delle floatingViews, dall'altra le modifiche funzionali alla mia applicazione N-S.
Salvo la MainActivity, notevole specialmente per il "trucchetto" che evita di dover riavviare l'applicazione dopo i permessi a runtime:
public class MainActivity extends AppCompatActivity {


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

        Runnable runnable = new Runnable() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void run() {
                if(Settings.canDrawOverlays(getApplicationContext())){
                    Intent i = new Intent(getApplicationContext(),MainActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(i);
                }else{
                    new Handler().postDelayed(this,1000);
                }
            }
        };


        if(Build.VERSION.SDK_INT >= 23 ){
            if(!Settings.canDrawOverlays(getApplicationContext())){
                Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
                startActivity(i);
                new Handler().postDelayed(runnable,1000);
            }
        }

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

    }

}


Salvo il codice dello studio teorico:
public class Servizio extends Service {
    int x_init_coord, y_init_coord, x_margin, y_margin;
    long time_start, time_end;
    private View mFloatingView;
    private View removeView;
    private WindowManager windowManager;
    private WindowManager.LayoutParams wParams;

    public Servizio() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();


        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        addFloatingWidgetView();
        addRemoveWidgetView();



    }

    private void addFloatingWidgetView() {
        mFloatingView = LayoutInflater.from(this).inflate(R.layout.widget, null);

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

        wParams.gravity = Gravity.TOP | Gravity.LEFT;
        wParams.x = 0;
        wParams.y = 100;

        windowManager.addView(mFloatingView, wParams);


        mFloatingView.setOnTouchListener(new View.OnTouchListener() {
            int x_init_coord, y_init_coord;
            int x_margin, y_margin;
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mFloatingView.getLayoutParams();
                int x_coord = (int) event.getRawX();
                int y_coord = (int) event.getRawY();
                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:

                        time_start = System.currentTimeMillis();

                        x_margin = layoutParams.x;
                        y_margin = layoutParams.y;
                        x_init_coord = x_coord;
                        y_init_coord = y_coord;
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        int x_diff = x_coord - x_init_coord;
                        int y_diff = y_coord - y_init_coord;
                        int x_destination = x_margin + x_diff;
                        int y_destination = y_margin + y_diff;
                        layoutParams.x = x_destination;
                        layoutParams.y = y_destination;
                        windowManager.updateViewLayout(view,layoutParams);
                        return true;
                    case MotionEvent.ACTION_UP:
                        int x_diff_up = x_coord - x_init_coord;
                        int y_diff_up = y_coord - y_init_coord;
                        if(Math.abs(x_diff_up) < 5  && Math.abs(y_diff_up) < 5){
                            time_end = System.currentTimeMillis();
                            if(time_end - time_start < 300){
                                System.out.println("E' UN CLICK");
                            }
                        }
                }
                return false;
            }
        });
    }




    private void addRemoveWidgetView(){

        LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
        removeView = inflater.inflate(R.layout.removewidget,null);

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

        windowManager.addView(removeView,removeParams);



    }


}


Salvo i due xml che vengono "inflatati" per la floatingView e per la removeView:

floatingVIew:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <!--Root container-->
    <RelativeLayout
        android:id="@+id/root_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:ignore="UselessParent">

        <ImageView
            android:adjustViewBounds="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src = "@drawable/facciadascemo"/>


    </RelativeLayout>

</FrameLayout> 


removeView:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <!--Root container-->
    <RelativeLayout
        android:id="@+id/root_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:ignore="UselessParent">

        <ImageView
            android:adjustViewBounds="true"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src = "@drawable/removeimage"/>


    </RelativeLayout>

</FrameLayout> 

Nessun commento:

Posta un commento