суббота, 28 июля 2012 г.

Поддержка управления в Android с помощью жестов.

Жесты - один из важнейших способов ввода в Android устройствах. Существует несколько категорий жестов, основные из которых это SingleTouch и Multitouch. 

Одной из желанных "плюшек" в приложении, так или иначе связанным с  изображениями является их масштабирование.

Под масштабированием будем понимать жесты трансформирующие наше View, и использующие более одного касания (мультитач).

Основой для приложения будет класс ScaleGestureDetector,  основной задачей которого является "узнавание" жестов масштабирования, и уведомления приложения с помощью CallBack'ов. При его использовании необходимо учитывать, что данная возможность доступна с версии Android 2.0 (Froyo).

Начнем с создания собственного ImageView.

Его код предельно прост:

package com.malice.scale;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
 
public class MyImageView extends View {
 
 private Drawable image;
 private float scaleFactor = 1.0f;
 private ScaleGestureDetector scaleGestureDetector;
 
 public MyImageView(Context context) {
  super(context);
  image = context.getResources().getDrawable(R.drawable.ic_launcher);
  setFocusable(true);
  image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
  scaleGestureDetector = new ScaleGestureDetector(context, new ScaleListener());
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  canvas.save();
  canvas.scale(scaleFactor, scaleFactor);
  image.draw(canvas);
  canvas.restore();
 }
 
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  scaleGestureDetector.onTouchEvent(event);
  invalidate();
  return true;
 }
 
 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
  @Override
  public boolean onScale(ScaleGestureDetector detector) {
   scaleFactor *= detector.getScaleFactor();
   scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));
   invalidate();
   return true;
  }
 }
}

Задача данного класса - формирование View на экране пользователя, и отрисовка Image на Canvas данной View. Одновременно с этим, мы создаем объект класса ScaleGestureDetector и определяем для него CallBack вызов.
При возникновении события мы перерисовываем Canvas согласно текущему коэффициенту масштабирования.
Для того, чтобы увидеть результат изменим код главной Activity:

package com.malice.scale;
 
import android.app.Activity;
import android.os.Bundle;
 
public class MainActivity extends Activity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(new MyImageView(this));
 }
}
 
Пример готов к использованию :)




Комментариев нет:

Отправить комментарий