Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Компонент ZoomControls появился в Android 3.0. Данный элемент управления можно рассматривать как две кнопки, где левая часть с лупой со знаком минус отвечает за уменьшение, а правая часть с лупой со знаком плюс отвечает за увеличение. Подобный элемент встроен в карты Google и используется для масштабирования. Также можно использовать для увеличения/уменьшения изображений котов.
Раньше компонент был представлен на панели инструментов в Eclipse и ранних версиях Android Studio. На данный момент он там не присутствует, хотя устаревшим не помечен. Можно использовать, если прописывать вручную.
Добавим ZoomControls и ImageView для экспериментов.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="Cat in Box"
android:src="@drawable/boxcat" />
<ZoomControls
android:id="@+id/zoomControls"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
</LinearLayout>
Далее переходим к коду. Для обработки нажатия правой части элемента (лупа с плюсом) используется метод setOnZoomInClickListener(), для левой части (лупа с минусом) - метод setOnZoomOutClickListener().
package ru.alexanderklimov.zoomcontrolsdemo;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ZoomControls;
public class MainActivity extends Activity {
private ZoomControls mZoomControls;
private ImageView mImageView;
private float scaleWidth = 1;
private float scaleHeight = 1;
private Bitmap bitmap;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.boxcat);
mImageView = (ImageView) findViewById(R.id.imageView);
mZoomControls = (ZoomControls) findViewById(R.id.zoomControls);
// mZoomControls.setIsZoomInEnabled(true);
// mZoomControls.setIsZoomOutEnabled(true);
// увеличение
mZoomControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
double scale = 1.25;
scaleWidth = (float) (scaleWidth * scale);
scaleHeight = (float) (scaleHeight * scale);
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
bmpHeight, matrix, true);
mImageView.setImageBitmap(resizeBmp);
}
});
// уменьшение
mZoomControls.setOnZoomOutClickListener(new OnClickListener() {
public void onClick(View v) {
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
double scale = 0.8;
scaleWidth = (float) (scaleWidth * scale);
scaleHeight = (float) (scaleHeight * scale);
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
bmpHeight, matrix, true);
mImageView.setImageBitmap(resizeBmp);
}
});
}
}
Ниже представлены три скриншота программы: исходное состояние, после уменьшения, после увеличения.