/* * Copyright (C) 2012 The Android Open Source Project * * 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. */ package #package_name#; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import #ManifestPackageName#.R; public class #class_name# extends Activity { private ImageView imgView; //available operations private final int MOVE = 1; private final int ZOOM = 2; private int action = 0; PointF startPoint = new PointF(); PointF centerPoint = new PointF(); //holds previous state information private double prevDist = 0; private Matrix curMatrix = new Matrix(); private Matrix auxMatrix = new Matrix(); //Minimum distance between fingers private Double MIN_DISTANCE; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.#layout_name#multitouch_event/multitouchlayout.xml#); // convert dip measurements to pixels. Screen independent value. final float scale = getResources().getDisplayMetrics().density; MIN_DISTANCE = (double) ( 15.0f * scale + 0.5f ); //loads image view imgView = (ImageView) findViewById(R.id.img01); imgView.setImageMatrix(curMatrix); imgView.setImageResource(R.drawable.#drawable_name#multitouch_event/multitouch.jpg#); imgView.setVisibility(View.VISIBLE); imgView.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView)v; //get the 8 bits that represents the action itself int eventType = event.getAction() & MotionEvent.ACTION_MASK; switch (eventType) { //first touch case MotionEvent.ACTION_DOWN: action = MOVE; auxMatrix.set(curMatrix); startPoint.set(event.getX(), event.getY()); break; //second touch case MotionEvent.ACTION_POINTER_DOWN: prevDist = distance(event); if (prevDist > MIN_DISTANCE) { action = ZOOM; auxMatrix.set(curMatrix); //used to center the image centerPoint = mean(event); } break; //movement event case MotionEvent.ACTION_MOVE: //using one finger we drag the image if (action == MOVE) { curMatrix.set(auxMatrix); //moves the image curMatrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y); } //using two fingers, zoom in or out and rotate the image else if (action == ZOOM) { double curDist = distance(event); if (curDist > MIN_DISTANCE) { curMatrix.set(auxMatrix); //relation between fingers distance Double scale = curDist / prevDist; //resize image keeping its center position curMatrix.postScale(scale.floatValue(), scale.floatValue(), centerPoint.x, centerPoint.y); } } break; } //apply changes view.setImageMatrix(curMatrix); return true; }}); } /*distance between the two fingers of dual touch event*/ private double distance(MotionEvent event) { float dy = event.getY(1) - event.getY(0); float dx = event.getX(1) - event.getX(0); dx *= dx; dy *= dy; return Math.sqrt(dx + dy); } /*evaluates the center point*/ private PointF mean(MotionEvent event) { PointF point = new PointF(); float dy = event.getY(1) + event.getY(0); float dx = event.getX(1) + event.getX(0); point.set(dx / 2, dy / 2); return point; } }