導航:首頁 > 操作系統 > android圖片手勢放大縮小

android圖片手勢放大縮小

發布時間:2022-08-24 10:04:30

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方法,攔截所有手勢,進而根據不同的手勢觸發不同的組件。

閱讀全文

與android圖片手勢放大縮小相關的資料

熱點內容
小米視頻加密之後怎麼看 瀏覽:70
超級程序員劉芳閱讀 瀏覽:826
顧家九爺在哪個app 瀏覽:820
我的世界怎麼在聯機大廳做伺服器 瀏覽:290
分手程序員 瀏覽:447
php將html導出為word 瀏覽:800
騰訊加密視頻能破解嗎 瀏覽:1007
反編譯後導入eclipse 瀏覽:948
買阿里雲伺服器有郵箱嗎 瀏覽:825
pdf卡片2004 瀏覽:309
e算量加密鎖檢測不到 瀏覽:776
python串口讀取數據類型 瀏覽:760
17年新款寶來壓縮機不跳 瀏覽:107
王者打著為什麼伺服器升級 瀏覽:847
aliyunlinux安裝 瀏覽:981
jdk8分層編譯 瀏覽:453
單片機脈沖計數程序 瀏覽:825
原相機文件夾名 瀏覽:330
淘寶雲伺服器靠什麼賺錢 瀏覽:136
單片機同步通信 瀏覽:259