您的位置:首页 > 移动开发 > Android开发

android 多点触控

2017-01-09 00:00 525 查看
public float []lastx = new float[]{0,0};
public float []lasty = new float[]{0,0};
int mode;
@Override
public boolean onTouch(View v, MotionEvent event) {
float []tmpx = new float[]{0,0};
float []tmpy = new float[]{0,0};
int actionIndex;
switch (event.getActionMasked()){
case MotionEvent.ACTION_POINTER_DOWN:
actionIndex = event.getActionIndex();
lastx[actionIndex] = event.getX(actionIndex);
lasty[actionIndex] = event.getY(actionIndex);
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_DOWN:
actionIndex = event.getActionIndex();
lastx[actionIndex] = event.getX(actionIndex);
lasty[actionIndex] = event.getY(actionIndex);
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
if(event.getPointerCount()==1){
//单手
tmpx[0] = event.getX(0);
tmpy[0] = event.getY(0);

rotate(lastx[0], lasty[0], tmpx[0], tmpy[0]);

lastx[0] = tmpx[0];
lasty[0] = tmpy[0];
}else if(event.getPointerCount()>=2){
//双手
tmpx[0] = event.getX(0);
tmpy[0] = event.getY(0);
tmpx[1] = event.getX(1);
tmpy[1] = event.getY(1);

moveOrScale(lastx, lasty, tmpx, tmpy);

lastx[0] = tmpx[0];
lasty[0] = tmpy[0];
lastx[1] = tmpx[1];
lasty[1] = tmpy[1];

}
break;
}
return true;
}

private float scale = 0f;
//上一个scale
private float defaultScale = 0f;
private float maxScale = 8;
//位移x
private float translateX = 0;
//位移y
private float translateY = 0;

boolean isLongClick = false;
public float []lastx = new float[]{0,0};
public float []lasty = new float[]{0,0};
public float []downx = new float[]{0,0};
public float []downy = new float[]{0,0};
public float downScale = 0;
private void onPDFTouch(MotionEvent event) {
float []tmpx = new float[]{0,0};
float []tmpy = new float[]{0,0};
int actionIndex;
switch (event.getActionMasked()){
case MotionEvent.ACTION_POINTER_DOWN:
actionIndex = event.getActionIndex();
if(actionIndex>=2){
return;
}
lastx[actionIndex] = event.getX(actionIndex);
lasty[actionIndex] = event.getY(actionIndex);
downx[actionIndex] = lastx[actionIndex];
downy[actionIndex] = lasty[actionIndex];
downScale = scale;

break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_DOWN:
isLongClick = true;
lastx[0] = event.getX(0);
lasty[0] = event.getY(0);
downx[0] = lastx[0];
downy[0] = lasty[0];
//长按时间,等待 longClickTime 毫秒触发
longClickRunable = new Runnable() {
@Override
public void run() {
if(isLongClick&&listener!=null) {
listener.onLongClick(NetcaPDFView.this, downx[0], downy[0]);
}
isLongClick = false;
longClickRunable = null;
}
};
handler.postDelayed(longClickRunable, longClickTime);

break;
case MotionEvent.ACTION_UP:
removeLongClick();
break;
case MotionEvent.ACTION_MOVE:
if(event.getPointerCount()==1){
//单手
tmpx[0] = event.getX(0);
tmpy[0] = event.getY(0);
//移动过大,判断为非长按
if(Math.abs(downx[0]-tmpx[0])>precision||Math.abs(downy[0]-tmpy[0])>precision){
removeLongClick();
}
//移动图片
float width = bitmapFactor*pageWidth*scale;
float height = bitmapFactor * pageHeight*scale;
float testX = translateX;
float testY = translateY;
testX -= (lastx[0]-tmpx[0]);
testY -= (lasty[0]-tmpy[0]);
if(testX<0&&testX+width>displayWidth){
translateX = testX;
}
if(testY<0&&testY+height>displayHeight){
translateY = testY;
}
invalidate();

lastx[0] = tmpx[0];
lasty[0] = tmpy[0];
}else if(event.getPointerCount()>=2){
removeLongClick();
//双手
tmpx[0] = event.getX(0);
tmpy[0] = event.getY(0);
tmpx[1] = event.getX(1);
tmpy[1] = event.getY(1);

float width = bitmapFactor*pageWidth*scale;
float height = bitmapFactor * pageHeight*scale;
float userScale = distance(tmpx[0], tmpy[0], tmpx[1], tmpy[1])/distance(downx[0], downy[0], downx[1], downy[1]);
float testScale = userScale*downScale;
if(testScale<defaultScale){
testScale= defaultScale;
}
if(testScale>maxScale){
testScale = maxScale;
}
float testX = translateX;
float testY = translateY;

float centerX = (downx[0]+downx[1])/2/testScale;
float centerY = (downy[0]+downy[1])/2/testScale;
testX = centerX-width/2.f;
testY = centerY-height/2.f;
if(testX+width<displayWidth){
testX = displayWidth - width;
}
if(testY+height<displayHeight){
testY = displayHeight - height;
}
if(testX>0){
testX = 0;
}
if(testY>0){
testY = 0;
}

if(Math.abs(testScale-scale)>0.01){
translateX = testX;
translateY = testY;
scale = testScale;
}
invalidate();
lastx[0] = tmpx[0];
lasty[0] = tmpy[0];
lastx[1] = tmpx[1];
lasty[1] = tmpy[1];

}
break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: