JavascriptProva

sabato 27 maggio 2017

Animazioni, primi approcci

Sono riuscito a ottenere delle animazioni.
Preferisco farle programmaticamente perché non sono riuscito in XML a spostare la view effettivamente.

Questo un codice:
public class MainActivity extends AppCompatActivity {

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

        imageView=(ImageView)findViewById(R.id.imageView);
        imageView.getLayoutParams().width=200;
        imageView.setAdjustViewBounds(true);

        animation=new TranslateAnimation(0,100,0,0);

        animation.setInterpolator(AnimationUtils.loadInterpolator
                (this,android.R.anim.linear_interpolator));
        animation.setDuration(200);
        animation.setFillAfter(false);
        animation.setFillEnabled(true);

        animation.setAnimationListener(new Animation.AnimationListener(){

            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                RelativeLayout.LayoutParams params=
                        (RelativeLayout.LayoutParams)imageView.getLayoutParams();
                System.out.println(params.leftMargin);
                params.leftMargin+=100;
                params.rightMargin=-1;
                imageView.setLayoutParams(params);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

        imageView.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                imageView.startAnimation(animation);

            }
        });
    }

}
Ora rompo il Mandala e ricomincio...

sabato 20 maggio 2017

Immagine tonda che appare a intervalli prestabiliti

Ecco un'immagine circolare che appare a intervalli di tempo prestabiliti.

MainActivity:
package com.antonello.tavolaccio5;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    Button bttCancel;
    Button button;
    RelativeLayout mainLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
        button=(Button)findViewById(R.id.button);
        bttCancel=(Button)findViewById(R.id.button2);




        button.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                if(Build.VERSION.SDK_INT>=23 && !Settings.canDrawOverlays(getApplicationContext())){
                    Intent intent=new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
                    startActivityForResult(intent,0);
                }else {
                    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                    Intent intent = new Intent(getApplicationContext(), Servizio.class);
                    PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);
                    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000 * 5,
                            pendingIntent);
                }
            }
        });

        bttCancel.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {

                AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
                Intent intent=new Intent(getApplicationContext(),Servizio.class);
                PendingIntent pendingIntent=PendingIntent.getService(getApplicationContext(),0,intent,0);
                alarmManager.cancel(pendingIntent);
                if(pendingIntent!=null)pendingIntent.cancel();
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){

        if(Build.VERSION.SDK_INT>=23 && Settings.canDrawOverlays(getApplicationContext())){
            AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
            Intent intent=new Intent(getApplicationContext(),Servizio.class);
            PendingIntent pendingIntent=PendingIntent.getService(getApplicationContext(),0,intent,0);
            alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+1000*5,
                    pendingIntent);
        }
    }
}


Servizio.java
package com.antonello.tavolaccio5;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.WindowManager;

/**
 * Created by Antonello on 19/05/2017.
 */

public class Servizio extends Service {

    RoundedImage roundedImage;
    WindowManager.LayoutParams wParams;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        final WindowManager windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);

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

        roundedImage = new RoundedImage(this, BitmapFactory.decodeResource(getResources(),R.drawable.scrofalo),100);
        roundedImage.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                windowManager.removeView(v);
                //roundedImage=null;
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                Intent intent = new Intent(getApplicationContext(), Servizio.class);
                PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);
                alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000 * 5,
                        pendingIntent);

            }
        });

        windowManager.addView(roundedImage,wParams);

        stopSelf();
        return START_NOT_STICKY;
    }



}


RoundedImage.java
package com.antonello.tavolaccio5;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;


/**
 * Created by Antonello on 19/05/2017.
 */

public class RoundedImage extends android.support.v7.widget.AppCompatImageView {

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

    }
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.antonello.tavolaccio5.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:id="@+id/textView" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="99dp"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button"
        android:layout_alignStart="@+id/button"
        android:layout_below="@+id/button"
        android:layout_marginTop="120dp"
        android:text="Button" />

</RelativeLayout> 

venerdì 19 maggio 2017

Permessi di disegno di un overlay nelle API da 23 in su

Ecco il codice:
public class MainActivity extends AppCompatActivity {

    Intent i;
    RelativeLayout mainLayout;
    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);

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

        }else {
        i = new Intent(this, Servizio.class);
        startService(i);
        }

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(Build.VERSION.SDK_INT>=23) {
            if (Settings.canDrawOverlays(this)) {
                i = new Intent(this, Servizio.class);
                startService(i);

            }
        }
    }
}


Service:
public class Servizio extends Service {


    Bitmap bitmap;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

   
    @Override
    public int onStartCommand(Intent intent, int flags, int startId){


        bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.scrofalo);
        RoundedImage image=new RoundedImage(this,bitmap,200);
        WindowManager windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);

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

        windowManager.addView(image,params);
        return START_NOT_STICKY;
    }

}
Chiama la classe RoundedImage, che ho creato e messo in una libreria.

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

        }


    }


}

lunedì 15 maggio 2017

Aggiunta di una ImageView rotonda alla finestra

Codice per l'aggiunta di una ImageView contenente una bitmap rotonda alla finestra.

MainActivity:
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);

        WindowManager windowManager=(WindowManager) getSystemService(WINDOW_SERVICE);

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

        Bitmap b= BitmapFactory.decodeResource(getResources(),R.drawable.gatto);
        RoundedImage roundedImage=new RoundedImage(this,b,200);

        windowManager.addView(roundedImage,wParams);
    }
}


RoundedImage:
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);

    }
}
E accidenti, se funziona!

Immagini rotonde in Android

Ecco il codice:
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);


        Bitmap bitmap= Bitmap.createBitmap(300,300,Bitmap.Config.ARGB_8888);
        Bitmap immagine= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo);

        Paint paint=new Paint();

        paint.setColor(Color.BLUE);
        Canvas canvas=new Canvas(bitmap);

        canvas.drawCircle(bitmap.getWidth()/2,bitmap.getHeight()/2,bitmap.getWidth()/2,paint);

        Rect rect1=new Rect(0,0,426,426);
        Rect rect=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());


        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(immagine,rect1,rect,paint);

        imageView.setImageBitmap(bitmap);

        mainLayout.addView(imageView);
        imageView.bringToFront();

    }
}
Descriviamo i passaggi ordinatamente, in modo da cercare di memorizzarli.
  • Si crea una nuova bitmap delle dimensioni volute. Però bisogna anche manipolare quella che credo sia la quantità di pixel necessari alla memorizzazione dei colori e dell'alpha, mediante Bitmap.Config.ARGB_8888.
  • Si ottiene una bitmap dall'immagine in risorse da rendere circolare.
Questa la prima parte, la generazione delle bitmaps.
Poi:
  • Si crea il Canvas avente per parametro la bitmap creata ex novo.
  • Si crea il Paint.
Quindi si disegna il cerchio e l'immagine da rendere tonda
  • Si disegna il cerchio.
  • Si predispongono per la bitmap scelta: XferMode, rettangolo di partenza e rettangolo di destinazione.
  • Si disegna la bitmap mettendo i parametri rettangolo di partenza e destinazione.
Provo a rompere il "Mandala" e rifare tutto da capo...

Okay, direi okay...