Android的:在两指放大/缩小 [英] android:two finger zoom in/out
本文介绍了Android的:在两指放大/缩小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在屏幕上绘制一个对象(矩形),现在我想补充两指缩放视口。我发现一些教程,是放大图像,我改变/补充说,我的应用程序,它运行但在输入/输出不起作用放大!没有错误也!
你能不能帮我修复呢?这是。一个好的方式来放大/缩小视图端口?
公共类android1扩展活动实现OnTouchListener {
/ **当第一次创建活动调用。 * /
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow()。setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
GLSurfaceView视图=新GLSurfaceView(本);
view.setRenderer(新OpenGLRenderer());
的setContentView(视图);
view.setOnTouchListener(本);
} 私有静态最后弦乐TAG =触摸;
//这些矩阵将用于移动和放大图像
字模=新的Matrix();
矩阵savedMatrix =新的Matrix(); //我们可以在这3个国家之一
静态最终诠释NONE = 0;
静态最终诠释ZOOM = 2;
INT模式=无; //记住一些东西放大
的PointF开始=新的PointF();
的PointF中旬=新的PointF();
浮oldDist = 1F;
公共布尔onTouch(视图V,MotionEvent事件){
开关(event.getAction()及MotionEvent.ACTION_MASK){
案例MotionEvent.ACTION_DOWN:
savedMatrix.set(矩阵);
start.set(event.getX(),event.getY());
Log.d(TAG模式= DRAG); 打破;
案例MotionEvent.ACTION_POINTER_DOWN:
oldDist =间距(事件);
Log.d(TAGoldDist =+ oldDist);
如果(oldDist> 10F){
savedMatrix.set(矩阵);
中点(中,事件);
模式= ZOOM;
Log.d(TAG模式= ZOOM);
}
打破;
案例MotionEvent.ACTION_UP:
案例MotionEvent.ACTION_POINTER_UP:
模式=无;
Log.d(TAG模式= NONE);
打破;
案例MotionEvent.ACTION_MOVE: 如果(==模式ZOOM){
浮newDist =间距(事件);
Log.d(TAGnewDist =+ newDist);
如果(newDist> 10F){
matrix.set(savedMatrix);
浮规模= newDist / oldDist;
matrix.postScale(规模化,规模化,mid.x,mid.y);
}
}
打破;
} 返回true; //表示事件已处理
} / **显示在LogCat中查看事件,调试* /
私人无效dumpEvent(MotionEvent事件){
字符串名称[] = {DOWN,UP,MOVE,取消,外,
POINTER_DOWN,POINTER_UP,7?,8?,9? };
StringBuilder的SB =新的StringBuilder();
INT行动= event.getAction();
INT行动code =动作&安培; MotionEvent.ACTION_MASK;
sb.append(事件响应_)追加(名称[动作code]);
如果(动作code == MotionEvent.ACTION_POINTER_DOWN
||行动code == MotionEvent.ACTION_POINTER_UP){
sb.append((PID).append(
作用>> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append());
}
sb.append([);
的for(int i = 0; I< event.getPointerCount();我++){
。sb.append(#)追加(ⅰ);
sb.append((PID).append(event.getPointerId(ⅰ));
sb.append()=)追加((int)的event.getX(ⅰ))。
。sb.append(,)附加((int)的event.getY(ⅰ));
如果第(i + 1&下; event.getPointerCount())
sb.append(;);
}
sb.append(]);
Log.d(TAG,sb.toString());
} / **确定第一两个手指之间的空间* /
私人浮动间距(MotionEvent事件){
浮X = event.getX(0) - event.getX(1);
浮Y = event.getY(0) - event.getY(1);
返回FloatMath.sqrt(X * X + Y * Y);
} / **计算前两个手指的中点* /
私人无效中点(点的PointF,MotionEvent事件){
浮X = event.getX(0)+ event.getX(1);
浮Y = event.getY(0)+ event.getY(1);
point.set(X / 2,Y / 2);
}
}
解决方案
你正确设置矩阵,但你不把它应用到你的观点。在你onTouch活动结束:
v.setImageMatrix(矩阵);
I draw an object (rectangle) on the screen and now I want to add two finger zooming to the viewport . I find some tutorial that was for zooming into an image , I changed/added that to my app , it runs but zoom in/out does not work! There's no error also ! could you help me fixing that ? is this agood way to zoom in/out of view port?
public class android1 extends Activity implements OnTouchListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
GLSurfaceView view = new GLSurfaceView(this);
view.setRenderer(new OpenGLRenderer());
setContentView(view);
view.setOnTouchListener(this);
}
private static final String TAG = "Touch";
// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
// We can be in one of these 3 states
static final int NONE = 0;
static final int ZOOM = 2;
int mode = NONE;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG");
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_MOVE:
if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
return true; // indicate event was handled
}
/** Show an event in the LogCat view, for debugging */
private void dumpEvent(MotionEvent event) {
String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
"POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
StringBuilder sb = new StringBuilder();
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
sb.append("event ACTION_").append(names[actionCode]);
if (actionCode == MotionEvent.ACTION_POINTER_DOWN
|| actionCode == MotionEvent.ACTION_POINTER_UP) {
sb.append("(pid ").append(
action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")");
}
sb.append("[");
for (int i = 0; i < event.getPointerCount(); i++) {
sb.append("#").append(i);
sb.append("(pid ").append(event.getPointerId(i));
sb.append(")=").append((int) event.getX(i));
sb.append(",").append((int) event.getY(i));
if (i + 1 < event.getPointerCount())
sb.append(";");
}
sb.append("]");
Log.d(TAG, sb.toString());
}
/** Determine the space between the first two fingers */
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
/** Calculate the mid point of the first two fingers */
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
}
解决方案
You're setting the matrix correctly but you don't apply it to your view. At the end of your onTouch event:
v.setImageMatrix(matrix);
这篇关于Android的:在两指放大/缩小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文