Use SkTouchGesture to handle pinch events in Android SampleApp.

http://codereview.appspot.com/4631043/


git-svn-id: http://skia.googlecode.com/svn/trunk@1624 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
Scroggo 2011-06-17 12:46:17 +00:00
parent 1bce0a5857
commit a54e2f61f8
5 changed files with 59 additions and 60 deletions

View File

@ -132,7 +132,7 @@ JNIEXPORT bool JNICALL Java_com_skia_sampleapp_SampleApp_handleKeyDown(
JNIEXPORT bool JNICALL Java_com_skia_sampleapp_SampleApp_handleKeyUp(
JNIEnv* env, jobject thiz, jint keyCode);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_handleClick(
JNIEnv* env, jobject thiz, jint x, jint y, jint state);
JNIEnv* env, jobject thiz, jint owner, jfloat x, jfloat y, jint state);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_createOSWindow(
JNIEnv* env, jobject thiz, jobject jsampleView);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_setZoomCenter(
@ -168,7 +168,7 @@ JNIEXPORT bool JNICALL Java_com_skia_sampleapp_SampleApp_handleKeyUp(JNIEnv* env
}
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_handleClick(JNIEnv* env,
jobject thiz, jint x, jint y, jint jstate)
jobject thiz, jint owner, jfloat x, jfloat y, jint jstate)
{
SkView::Click::State state;
switch(jstate) {
@ -186,7 +186,7 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_handleClick(JNIEnv* env
SkDebugf("motion event ignored\n");
return;
}
gWindow->handleClick(x, y, state);
gWindow->handleTouch(owner, x, y, state);
}
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_updateSize(JNIEnv* env,

View File

@ -208,11 +208,9 @@ public class SampleApp extends Activity
// Currently depends on init having already been called.
native void createOSWindow(SampleView view);
native void updateSize(int w, int h);
native void handleClick(int x, int y, int state);
native void handleClick(int owner, float x, float y, int state);
native boolean handleKeyDown(int key, int uni);
native boolean handleKeyUp(int key);
native void zoom(float factor);
native void setZoomCenter(float x, float y);
native void nextSample(boolean previous);
native void toggleRendering();
native void toggleSlideshow();

View File

@ -23,19 +23,15 @@ import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class SampleView extends GLSurfaceView implements OnScaleGestureListener {
public class SampleView extends GLSurfaceView {
private final SampleApp mApp;
private ScaleGestureDetector mDetector;
public SampleView(SampleApp app) {
super(app);
@ -44,7 +40,6 @@ public class SampleView extends GLSurfaceView implements OnScaleGestureListener
setEGLConfigChooser(8,8,8,8,0,8);
setRenderer(new SampleView.Renderer());
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
mDetector = new ScaleGestureDetector(app, this);
}
// Called by JNI
@ -60,58 +55,31 @@ public class SampleView extends GLSurfaceView implements OnScaleGestureListener
@Override
public boolean onTouchEvent(MotionEvent event) {
mDetector.onTouchEvent(event);
if (mDetector.isInProgress()) {
return true;
}
final int x = (int) event.getX();
final int y = (int) event.getY();
final int action = event.getAction();
queueEvent(new Runnable() {
@Override
public void run() {
mApp.handleClick(x, y, action);
}
});
return true;
}
// ScaleGestureDetector.OnScaleGestureListener implementation
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
final float x = detector.getFocusX();
final float y = detector.getFocusY();
queueEvent(new Runnable() {
@Override
public void run() {
mApp.setZoomCenter(x, y);
int count = event.getPointerCount();
for (int i = 0; i < count; i++) {
final float x = event.getX(i);
final float y = event.getY(i);
final int owner = event.getPointerId(i);
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_POINTER_UP:
action = MotionEvent.ACTION_UP;
break;
case MotionEvent.ACTION_POINTER_DOWN:
action = MotionEvent.ACTION_DOWN;
break;
default:
break;
}
});
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
if (detector.getScaleFactor() != 1) {
final float difference = detector.getCurrentSpan()
- detector.getPreviousSpan();
final int finalAction = action;
queueEvent(new Runnable() {
@Override
public void run() {
mApp.zoom(difference * .01f);
}
@Override
public void run() {
mApp.handleClick(owner, x, y, finalAction);
}
});
return true;
}
return false;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
return true;
}
private class Renderer implements GLSurfaceView.Renderer {

View File

@ -1175,6 +1175,37 @@ SkView::Click* SampleWindow::onFindClickHandler(SkScalar x, SkScalar y) {
return new GestureClick(this);
}
union IntPtr {
int fInt;
void* fPtr;
};
static void* int2ptr(int n) {
IntPtr data;
data.fInt = n;
return data.fPtr;
}
bool SampleWindow::handleTouch(int ownerId, float x, float y, SkView::Click::State state) {
void* click = int2ptr(ownerId);
switch(state) {
case SkView::Click::kDown_State:
fGesture.touchBegin(click, x, y);
break;
case SkView::Click::kMoved_State:
fGesture.touchMoved(click, x, y);
this->inval(NULL);
break;
case SkView::Click::kUp_State:
fGesture.touchEnd(click);
this->inval(NULL);
break;
default:
return false;
}
return true;
}
bool SampleWindow::onClick(Click* click) {
if (GestureClick::IsGesture(click)) {
float x = SkScalarToFloat(click->fCurr.fX);

View File

@ -58,6 +58,8 @@ public:
void changeZoomLevel(float delta);
bool nextSample();
bool previousSample();
bool handleTouch(int ownerId, float x, float y,
SkView::Click::State state);
protected:
virtual void onDraw(SkCanvas* canvas);