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