/*******************************************************************************
* Copyright 2011, 2012 Chris Banes.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*http://www.apache.org/licenses/LICENSE-2.0*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
packageuk.co.senab.photoview.sample;importandroid.app.Activity;importandroid.content.Intent;importandroid.graphics.Bitmap;importandroid.graphics.Matrix;importandroid.graphics.RectF;importandroid.graphics.drawable.Drawable;importandroid.net.Uri;importandroid.os.Bundle;importandroid.os.Environment;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.widget.ImageView;importandroid.widget.ImageView.ScaleType;importandroid.widget.TextView;importandroid.widget.Toast;importjava.io.File;importjava.io.FileOutputStream;importjava.util.Random;importuk.co.senab.photoview.PhotoViewAttacher;importuk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedListener;importuk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener;public class SimpleSampleActivity extendsActivity {static final String PHOTO_TAP_TOAST_STRING = "Photo Tap! X: %.2f %% Y:%.2f %% ID: %d";static final String SCALE_TOAST_STRING = "Scaled to: %.2ff";privateTextView mCurrMatrixTv;privatePhotoViewAttacher mAttacher;privateToast mCurrentToast;private Matrix mCurrentDisplayMatrix = null;
@Overridepublic voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView mImageView=(ImageView) findViewById(R.id.iv_photo);
mCurrMatrixTv=(TextView) findViewById(R.id.tv_current_matrix);
Drawable bitmap=getResources().getDrawable(R.drawable.wallpaper);
mImageView.setImageDrawable(bitmap);//The MAGIC happens here!
mAttacher = newPhotoViewAttacher(mImageView);//Lets attach some listeners, not required though!
mAttacher.setOnMatrixChangeListener(newMatrixChangeListener());
mAttacher.setOnPhotoTapListener(newPhotoTapListener());
}
@Overridepublic booleanonCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);return super.onCreateOptionsMenu(menu);
}
@Overridepublic voidonDestroy() {super.onDestroy();//Need to call clean-up
mAttacher.cleanup();
}
@Overridepublic booleanonPrepareOptionsMenu(Menu menu) {
MenuItem zoomToggle=menu.findItem(R.id.menu_zoom_toggle);assert null !=zoomToggle;
zoomToggle.setTitle(mAttacher.canZoom()?R.string.menu_zoom_disable : R.string.menu_zoom_enable);return super.onPrepareOptionsMenu(menu);
}
@Overridepublic booleanonOptionsItemSelected(MenuItem item) {switch(item.getItemId()) {caseR.id.menu_zoom_toggle:
mAttacher.setZoomable(!mAttacher.canZoom());return true;caseR.id.menu_scale_fit_center:
mAttacher.setScaleType(ScaleType.FIT_CENTER);return true;caseR.id.menu_scale_fit_start:
mAttacher.setScaleType(ScaleType.FIT_START);return true;caseR.id.menu_scale_fit_end:
mAttacher.setScaleType(ScaleType.FIT_END);return true;caseR.id.menu_scale_fit_xy:
mAttacher.setScaleType(ScaleType.FIT_XY);return true;caseR.id.menu_scale_scale_center:
mAttacher.setScaleType(ScaleType.CENTER);return true;caseR.id.menu_scale_scale_center_crop:
mAttacher.setScaleType(ScaleType.CENTER_CROP);return true;caseR.id.menu_scale_scale_center_inside:
mAttacher.setScaleType(ScaleType.CENTER_INSIDE);return true;caseR.id.menu_scale_random_animate:caseR.id.menu_scale_random:
Random r= newRandom();float minScale =mAttacher.getMinimumScale();float maxScale =mAttacher.getMaximumScale();float randomScale = minScale + (r.nextFloat() * (maxScale -minScale));
mAttacher.setScale(randomScale, item.getItemId()==R.id.menu_scale_random_animate);
showToast(String.format(SCALE_TOAST_STRING, randomScale));return true;caseR.id.menu_matrix_restore:if (mCurrentDisplayMatrix == null)
showToast("You need to capture display matrix first");elsemAttacher.setDisplayMatrix(mCurrentDisplayMatrix);return true;caseR.id.menu_matrix_capture:
mCurrentDisplayMatrix=mAttacher.getDisplayMatrix();return true;caseR.id.extract_visible_bitmap:try{
Bitmap bmp=mAttacher.getVisibleRectangleBitmap();
File tmpFile= File.createTempFile("photoview", ".png",
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
FileOutputStream out= newFileOutputStream(tmpFile);
bmp.compress(Bitmap.CompressFormat.PNG,90, out);
out.close();
Intent share= newIntent(Intent.ACTION_SEND);
share.setType("image/png");
share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tmpFile));
startActivity(share);
Toast.makeText(this, String.format("Extracted into: %s", tmpFile.getAbsolutePath()), Toast.LENGTH_SHORT).show();
}catch(Throwable t) {
t.printStackTrace();
Toast.makeText(this, "Error occured while extracting bitmap", Toast.LENGTH_SHORT).show();
}return true;
}return super.onOptionsItemSelected(item);
}private class PhotoTapListener implementsOnPhotoTapListener {
@Overridepublic void onPhotoTap(View view, float x, floaty) {float xPercentage = x *100f;float yPercentage = y *100f;
showToast(String.format(PHOTO_TAP_TOAST_STRING, xPercentage, yPercentage, view== null ? 0: view.getId()));
}
}private voidshowToast(CharSequence text) {if (null !=mCurrentToast) {
mCurrentToast.cancel();
}
mCurrentToast= Toast.makeText(SimpleSampleActivity.this, text, Toast.LENGTH_SHORT);
mCurrentToast.show();
}private class MatrixChangeListener implementsOnMatrixChangedListener {
@Overridepublic voidonMatrixChanged(RectF rect) {
mCurrMatrixTv.setText(rect.toString());
}
}
}