• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.shaderstest;
18 
19 import android.content.Context;
20 import android.renderscript.RSSurfaceView;
21 import android.renderscript.RenderScriptGL;
22 import android.view.MotionEvent;
23 import android.view.ScaleGestureDetector;
24 import android.view.SurfaceHolder;
25 
26 public class ShadersTestView extends RSSurfaceView {
27 
28     private RenderScriptGL mRS;
29     private ShadersTestRS mRender;
30 
31     private ScaleGestureDetector mScaleDetector;
32 
33     private static final int INVALID_POINTER_ID = -1;
34     private int mActivePointerId = INVALID_POINTER_ID;
35 
ShadersTestView(Context context)36     public ShadersTestView(Context context) {
37         super(context);
38         ensureRenderScript();
39         mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
40     }
41 
ensureRenderScript()42     private void ensureRenderScript() {
43         if (mRS == null) {
44             RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
45             sc.setDepth(16, 24);
46             mRS = createRenderScriptGL(sc);
47             mRender = new ShadersTestRS();
48             mRender.init(mRS, getResources());
49         }
50     }
51 
52     @Override
onAttachedToWindow()53     protected void onAttachedToWindow() {
54         super.onAttachedToWindow();
55         ensureRenderScript();
56     }
57 
58     @Override
surfaceChanged(SurfaceHolder holder, int format, int w, int h)59     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
60         super.surfaceChanged(holder, format, w, h);
61         mRender.surfaceChanged();
62     }
63 
64     @Override
onDetachedFromWindow()65     protected void onDetachedFromWindow() {
66         mRender = null;
67         if (mRS != null) {
68             mRS = null;
69             destroyRenderScriptGL();
70         }
71     }
72 
73     @Override
onTouchEvent(MotionEvent ev)74     public boolean onTouchEvent(MotionEvent ev) {
75         mScaleDetector.onTouchEvent(ev);
76 
77         boolean ret = false;
78         float x = ev.getX();
79         float y = ev.getY();
80 
81         final int action = ev.getAction();
82 
83         switch (action & MotionEvent.ACTION_MASK) {
84         case MotionEvent.ACTION_DOWN: {
85             mRender.onActionDown(x, y);
86             mActivePointerId = ev.getPointerId(0);
87             ret = true;
88             break;
89         }
90         case MotionEvent.ACTION_MOVE: {
91             if (!mScaleDetector.isInProgress()) {
92                 mRender.onActionMove(x, y);
93             }
94             mRender.onActionDown(x, y);
95             ret = true;
96             break;
97         }
98 
99         case MotionEvent.ACTION_UP: {
100             mActivePointerId = INVALID_POINTER_ID;
101             break;
102         }
103 
104         case MotionEvent.ACTION_CANCEL: {
105             mActivePointerId = INVALID_POINTER_ID;
106             break;
107         }
108 
109         case MotionEvent.ACTION_POINTER_UP: {
110             final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
111                     >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
112             final int pointerId = ev.getPointerId(pointerIndex);
113             if (pointerId == mActivePointerId) {
114                 // This was our active pointer going up. Choose a new
115                 // active pointer and adjust accordingly.
116                 final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
117                 x = ev.getX(newPointerIndex);
118                 y = ev.getY(newPointerIndex);
119                 mRender.onActionDown(x, y);
120                 mActivePointerId = ev.getPointerId(newPointerIndex);
121             }
122             break;
123         }
124         }
125 
126         return ret;
127     }
128 
129     private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
130         @Override
onScale(ScaleGestureDetector detector)131         public boolean onScale(ScaleGestureDetector detector) {
132             mRender.onActionScale(detector.getScaleFactor());
133             return true;
134         }
135     }
136 }
137 
138 
139