① android想要利用多點觸控放大或者縮小一個view該怎麼實現
放大縮小view方法有很多。
1.animation,在xml里寫出動畫,讓他放大,然後不恢復。
2.如果是個imageview(圖片),可以將他的一個屬性設置為這樣android:scaleType="matrix",然後在代碼里操作這個矩陣。獲得放大縮小的效果。
3.如果是自定義的view,在canvas里放大縮小就很容易了
多點觸控,就是重寫onTouchEvent(MotionEvent event){}
② 如何通過手勢實現android view 的 縮放 平移
代碼主要分兩部分,一個activity一個view,代碼如下:
java">packagecom.example.touch;
importandroid.app.Activity;
importandroid.os.Bundle;
{
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
TouchImageViewimg=newTouchImageView(this);
setContentView(img);
}
}
packagecom.example.touch;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.Config;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Matrix;
importandroid.graphics.PointF;
importandroid.util.DisplayMetrics;
importandroid.util.FloatMath;
importandroid.view.MotionEvent;
importandroid.widget.ImageView;
{
floatx_down=0;
floaty_down=0;
PointFstart=newPointF();
PointFmid=newPointF();
floatoldDist=1f;
floatoldRotation=0;
Matrixmatrix=newMatrix();
Matrixmatrix1=newMatrix();
MatrixsavedMatrix=newMatrix();
privatestaticfinalintNONE=0;
privatestaticfinalintDRAG=1;
privatestaticfinalintZOOM=2;
intmode=NONE;
booleanmatrixCheck=false;
intwidthScreen;
intheightScreen;
Bitmapgintama;
publicTouchImageView(){
super(activity);
gintama=BitmapFactory.decodeResource(getResources(),R.drawable.gintama);
DisplayMetricsdm=newDisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
widthScreen=dm.widthPixels;
heightScreen=dm.heightPixels;
matrix=newMatrix();
}
protectedvoidonDraw(Canvascanvas){
canvas.save();
canvas.drawBitmap(gintama,matrix,null);
canvas.restore();
}
publicbooleanonTouchEvent(MotionEventevent){
switch(event.getAction()&MotionEvent.ACTION_MASK){
caseMotionEvent.ACTION_DOWN:
mode=DRAG;
x_down=event.getX();
y_down=event.getY();
savedMatrix.set(matrix);
break;
caseMotionEvent.ACTION_POINTER_DOWN:
mode=ZOOM;
oldDist=spacing(event);
oldRotation=rotation(event);
savedMatrix.set(matrix);
midPoint(mid,event);
break;
caseMotionEvent.ACTION_MOVE:
if(mode==ZOOM){
matrix1.set(savedMatrix);
floatrotation=rotation(event)-oldRotation;
floatnewDist=spacing(event);
floatscale=newDist/oldDist;
matrix1.postScale(scale,scale,mid.x,mid.y);//縮放
matrix1.postRotate(rotation,mid.x,mid.y);//旋轉
matrixCheck=matrixCheck();
if(matrixCheck==false){
matrix.set(matrix1);
invalidate();
}
}elseif(mode==DRAG){
matrix1.set(savedMatrix);
matrix1.postTranslate(event.getX()-x_down,event.getY()
-y_down);//平移
matrixCheck=matrixCheck();
matrixCheck=matrixCheck();
if(matrixCheck==false){
matrix.set(matrix1);
invalidate();
}
}
break;
caseMotionEvent.ACTION_UP:
caseMotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;
}
returntrue;
}
privatebooleanmatrixCheck(){
float[]f=newfloat[9];
matrix1.getValues(f);
//圖片4個頂點的坐標
floatx1=f[0]*0+f[1]*0+f[2];
floaty1=f[3]*0+f[4]*0+f[5];
floatx2=f[0]*gintama.getWidth()+f[1]*0+f[2];
floaty2=f[3]*gintama.getWidth()+f[4]*0+f[5];
floatx3=f[0]*0+f[1]*gintama.getHeight()+f[2];
floaty3=f[3]*0+f[4]*gintama.getHeight()+f[5];
floatx4=f[0]*gintama.getWidth()+f[1]*gintama.getHeight()+f[2];
floaty4=f[3]*gintama.getWidth()+f[4]*gintama.getHeight()+f[5];
//圖片現寬度
doublewidth=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
//縮放比率判斷
if(width<widthScreen/3||width>widthScreen*3){
returntrue;
}
//出界判斷
if((x1<widthScreen/3&&x2<widthScreen/3
&&x3<widthScreen/3&&x4<widthScreen/3)
||(x1>widthScreen*2/3&&x2>widthScreen*2/3
&&x3>widthScreen*2/3&&x4>widthScreen*2/3)
||(y1<heightScreen/3&&y2<heightScreen/3
&&y3<heightScreen/3&&y4<heightScreen/3)
||(y1>heightScreen*2/3&&y2>heightScreen*2/3
&&y3>heightScreen*2/3&&y4>heightScreen*2/3)){
returntrue;
}
returnfalse;
}
//觸碰兩點間距離
privatefloatspacing(MotionEventevent){
floatx=event.getX(0)-event.getX(1);
floaty=event.getY(0)-event.getY(1);
returnFloatMath.sqrt(x*x+y*y);
}
//取手勢中心點
privatevoidmidPoint(PointFpoint,MotionEventevent){
floatx=event.getX(0)+event.getX(1);
floaty=event.getY(0)+event.getY(1);
point.set(x/2,y/2);
}
//取旋轉角度
privatefloatrotation(MotionEventevent){
doubledelta_x=(event.getX(0)-event.getX(1));
doubledelta_y=(event.getY(0)-event.getY(1));
doubleradians=Math.atan2(delta_y,delta_x);
return(float)Math.toDegrees(radians);
}
//將移動,縮放以及旋轉後的圖層保存為新圖片
//本例中沒有用到該方法,需要保存圖片的可以參考
publicBitmapCreatNewPhoto(){
Bitmapbitmap=Bitmap.createBitmap(widthScreen,heightScreen,
Config.ARGB_8888);//背景圖片
Canvascanvas=newCanvas(bitmap);//新建畫布
canvas.drawBitmap(gintama,matrix,null);//畫圖片
canvas.save(Canvas.ALL_SAVE_FLAG);//保存畫布
canvas.restore();
returnbitmap;
}
}
③ android中的webview怎麼才能支持雙指手勢的放大縮小呢,我說android的不是蘋果
支持多點觸控就可以了
webview這個軟體本身就不支持多點觸控..
④ android 圖片放大縮小
網上有很多例子!
⑤ Android通過手勢實現的縮放處理,該怎麼解決
主要原理是onTouchEvent事件中的參數MotionEvent,它有一個getSize()方法。在一個點的時候,該方法永遠返回0,而在兩個
觸電的時候,該方法則根據兩點相對位置變化而返回不同的值。我們只需計算出兩點之間的距離變化,距離的大小表明我們希望目標變化的趨勢。而getX()和
getY()方法則永遠座落在兩觸點之間,這樣趨勢和目標我們都有了。剩下的就是對目標根據趨勢進行放大或縮小即可。參考代碼如下。
/**
*...
*
*@authorvlinux
*
*/
{
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
Viewview=newMultiTouchView(this);
setContentView(view);
}{
privatefloatx1;
privatefloaty1;
privatefloatx2;
privatefloaty2;
publicMultiTouchView(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
//TODOAuto-generatedmethodstub
floatsize=event.getSize();
intszi=(int)size;
intdxi=szi>>12;
intdyit=((1<<12)-1);
intdyi=szi&dyit;
DisplayMetricsmetrics=getResources().getDisplayMetrics();
floatdx=metrics.widthPixels*dxi/(float)dyit;
floatdy=metrics.heightPixels*dyi/(float)dyit;
x1=event.getX();
y1=event.getY();
x2=x1+dx;
y2=y1+dy;
invalidate();
returntrue;
}
@Override
protectedvoidonDraw(Canvascanvas){
//TODOAuto-generatedmethodstub
super.onDraw(canvas);
floatr=(float)Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)
*(y1-y2))/2;
r=50>=r?50:r;
Paintpaint=newPaint();
paint.setColor(Color.BLUE);
canvas.drawCircle(x1,y1,r,paint);
}
}
}
⑥ android 如何利用手勢放大和縮小textview
重寫TextView響應手勢的方法,然後在裡面改名textview的大小或者是改變字體的大小
⑦ 如何解決webView手勢放大縮小,設置不起作用
android手勢沖突解決方法如下:方法一:如代碼中含有ViewFlipper、ScrollView、ViewPager等有手勢反應的組件,且是用FrameLayout包裹的;但卻只想觸發其中某個組件的手勢反應,建議用View.setVisibility()方法,屏蔽掉ViewFlipper、ScrollView、ViewPager等有手勢反應組件(比如ViewFlipper.setVisibility()),到合適的時候,再將被屏蔽的組件顯示出來。方法二:如代碼中含有ViewFlipper、ScrollView、ViewPager等有手勢反應的組件;但卻想根據不同的手勢觸發不同的組件手勢反應,建議繼承並重寫以上組件,並用ViewGroup.onInterceptTouchEvent方法,攔截所有手勢,進而根據不同的手勢觸發不同的組件。