JavascriptProva

sabato 17 settembre 2016

Esercizi immagine scrollabile su View caricabile dalla memoria e con i tag Exif.

Esercizio:
Scrivere codice per un'immagine scrollabile su View con la possibilità di caricare un'immagine dalla memoria.
public class Immagine extends View {

    Context context;
    Drawable mImage;
    float lastX, lastY, posX, posY;
    public Immagine(Context context) {
        super(context);
        this.context=context;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                lastX=event.getX();
                lastY=event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                posX+=event.getX()-lastX;
                posY+=event.getY()-lastY;
                invalidate();
                lastX=event.getX();
                lastY=event.getY();
        }
        return true;
    }

    @Override
    public void onDraw(rCanvas canvas){
        super.onDraw(canvas);
        canvas.translate(posX,posY);
        canvas.save();
        try{
            mImage.draw(canvas);
        }catch(Exception e){}
        canvas.restore();
    }

    public void setImage(Bitmap bitmap){
        mImage=new BitmapDrawable(getResources(),bitmap);
        mImage.setBounds(0,0,bitmap.getWidth(),bitmap.getHeight());
        invalidate();
    }


Main:
public class MainActivity extends AppCompatActivity {
    RelativeLayout mainLayout;
    Immagine immagine;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
        immagine=new Immagine(this);
        button=(Button)findViewById(R.id.button);
        mainLayout.addView(immagine);
        button.setId(View.generateViewId());
        RelativeLayout.LayoutParams params=(RelativeLayout.LayoutParams)immagine.getLayoutParams();
        params.addRule(RelativeLayout.BELOW,button.getId());
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_PICK);
                intent.setData(Uri.parse("content://media/external/images/media"));
                startActivityForResult(intent,0);
            }
        });

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            Cursor crs=getContentResolver().query(data.getData(),null,null,null,null);
            crs.moveToFirst();
            int colonna=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            String path=crs.getString(colonna);
            Bitmap bmp= BitmapFactory.decodeFile(path);
            immagine.setImage(bmp);
        }
    }
}
Buona l'idea di non caricare nessuna immagine precedente gestendo l'errore generato dalla sua mancanza.


Esercizio n.2: correggere l'orientamento sbagliato delle immagini per mezzo dei tag Exif.
public class MainActivity extends AppCompatActivity {
    RelativeLayout mainLayout;
    Immagine immagine;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
        immagine=new Immagine(this);
        button=(Button)findViewById(R.id.button);
        mainLayout.addView(immagine);
        button.setId(View.generateViewId());
        RelativeLayout.LayoutParams params=(RelativeLayout.LayoutParams)immagine.getLayoutParams();
        params.addRule(RelativeLayout.BELOW,button.getId());
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Intent intent=new Intent();
                intent.setAction(Intent.ACTION_PICK);
                intent.setData(Uri.parse("content://media/external/images/media"));
                startActivityForResult(intent,0);
            }
        });

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            Cursor crs=getContentResolver().query(data.getData(),null,null,null,null);
            crs.moveToFirst();
            int colonna=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            String path=crs.getString(colonna);

            try {
                ExifInterface exifInterface =new ExifInterface(path);
                int orientation=exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
                int rotate=0;
                switch(orientation){
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotate=90;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotate=180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotate=270;
                        break;
                }

                Matrix matrix=new Matrix();
                matrix.postRotate(rotate);

                Bitmap b= BitmapFactory.decodeFile(path);

                Bitmap bmp=Bitmap.createBitmap(b,0,0,b.getWidth(),b.getHeight(),matrix,true);
                immagine.setImage(bmp);

            } catch (IOException e) {
                e.printStackTrace();
            }


        }
    }
}
Perfetto! Qui si gioca tutto sulla classe che istanzia Immagine.

Nessun commento:

Posta un commento