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