android自定義ImageView實現(xiàn)縮放,回彈效果_第1頁
android自定義ImageView實現(xiàn)縮放,回彈效果_第2頁
android自定義ImageView實現(xiàn)縮放,回彈效果_第3頁
android自定義ImageView實現(xiàn)縮放,回彈效果_第4頁
android自定義ImageView實現(xiàn)縮放,回彈效果_第5頁
免費預覽已結束,剩余3頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、android 自定義 ImageView 實現(xiàn)縮放,回彈效果androidimageview縮放回彈話不多說上代碼:MainActivity.javapublicclassMainActivityextendsActivityprivateLinearLayoutll_viewArea;privateLinearLayout.LayoutParamsparm;privateViewAreaviewArea;OverridepublicvoidonCreate(BundlesavedinstanceState)super.onCreate(savedinstanceState);/去除titl

2、erequestWindowFeature(Window.FEATURE_NO_TITLE);/去掉Activity上面的狀態(tài)欄getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.main);ll_viewArea=(LinearLayout)findViewByid(R.id.ll_viewArea);parm=newLinearLayout.LayoutParams(LinearL

3、ayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);viewArea=newViewArea(MainActivity.this,R.drawable.psu);/自定義布局控件,用來初始化并存放自定義imageViewll_viewArea.addView(viewArea,parm);)這段代碼中要注意的問題是去掉title和狀態(tài)欄兩句代碼必須放到setContentView(R.layout.main);話的前面。 而且這兩句話必須有, 因為后面計算回彈距離是根據(jù)全屏計算的(我的i9000就是480

4、x800),如果不去掉title和狀態(tài)欄, 后面的回彈會有誤差,總是回彈不到想要的位置。下面看看ViewArea.java文件。 就是用來存放和初始化自定義imageView的地方。 將來的自定義ImageView被限制在其內(nèi)部移動縮放。publicclassViewAreaextendsFrameLayout/前面說了ViewArea是一個布局,所以這里當然要繼承一個布局了。LinearLayout也可以privateintimgDisplayW;privateintimgDisplayH;privateintimgW;privateintimgH;privateTouchViewtouch

5、View;privateDisplayMetricsdm;/resid為圖片資源idpublicViewArea(Contextcontext,intresid)/第二個參數(shù)是圖片的資源ID,當然也可以用別的方式獲取圖片/*dm=newDisplayMetrics();(Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);imgDisplayW=dm.widthPixels;imgDisplayH=dm.heightPixels;*/這種方式獲取的屏幕大小和下面的方式結果是一樣的,都是480 x800(

6、i9000分辨率)super(context);imgDisplayW=(Activity)context).getWindowManager().getDefaultDisplay().getWidth();/這里的寬高要和xml中的LinearLayout大小一致, 如果要指定大小。xml中LinearLayout的寬高一定要用px像素單位,因為這里白寬高是像素,用dp會有誤差!imgDisplayH=(Activity)context).getWindowManager().getDefaultDisplay().getHeight();touchView=newTouchView(co

7、ntext,imgDisplayW,imgDisplayH);/這句就是我們的自定義ImageViewtouchView.setimageResource(resid);/給我們的自定義imageView設置要顯示的圖片Bitmapimg=BitmapFactory.decodeResource(context.getResources(),resid);imgW=img.getWidth();imgH=img.getHeight();/圖片第一次加載進來,判斷圖片大小從而確定第一次圖片的顯示方式。intlayout_w=imgWimgDisplayW?imgDisplayW:imgW;int

8、layout_h=imgHimgDisplayH?imgDisplayH:imgH;/下面的代碼是判斷圖片初始顯示樣式的,當然可以根據(jù)你的想法隨意顯示,我這里是將寬大于高的圖片按照寬縮小的比例把高壓縮,前提必須是寬度超出了屏幕大小,相反,如果高大于寬,我將圖片按照高縮小的比例把寬壓縮,前提必須是高度超出了屏幕大小if(imgW=imgH)if(layout_w=imgDisplayW)layout_h=(int)(imgH*(float)imgDisplayW/imgW);).elseif(layout_h=imgDisplayH)layout_w=(int)(imgW*(float)imgD

9、isplayH/imgH);).)一/這里需要注意的是, 采用FreamLayout或者LinearLayout的好處是, 如果壓縮后的圖片扔有一個邊大于屏幕,那么只顯示在屏幕內(nèi)的部分,可以通過移動后看見外部(不會裁剪掉圖片),如果采用RelativeLayout布局,圖片會始終完整顯示在屏幕內(nèi)部,不會有超出屏幕的現(xiàn)象。如果圖片不是完全占滿屏幕,那么在屏幕上沒有圖片的地方拖動,圖片也會移動,這樣的體驗不太好,建議用FreamLayout或者LinearLayout。touchView.setLayoutParams(newFrameLayout.LayoutParams(layout_w,la

10、yout_h);/這是自定義imageView的大小,也就是觸摸范圍一一this.addView(touchView);)ImageView.java是不是等了很久?!publicclassTouchViewextendsImageViewstaticfinalintNONE=0;/表示當前沒有狀態(tài)privatefloatbeforeLenght;/privatefloatafterLenght;/privatefloatscale=0.04f;/privateintscreenW;/下面兩句圖片的移動范圍,及ViewArea的范圍,也就是linearLayout的范圍,也就是屏幕方位(都是填

11、滿父控件屬性)privateintscreenH;privateintstart_x;/開始觸摸點privateintstart_y;privateintstop_x;/結束觸摸點privateintstop_y;privateTranslateAnimationtrans;/staticfinalintDRAG=1;/staticfinalintZOOM=2;/staticfinalintBIGGER=3;/staticfinalintSMALLER=4;/privateintmode=NONE;/mode表小當前處于移動狀態(tài)表示當前處于縮放狀態(tài)表示放大圖片表小縮小圖片用于標示當前處于什么狀

12、態(tài)第一次觸摸兩點的距離移動后兩點的距離縮放因子回彈動畫publicTouchView(Contextcontext,intw,inth)/就是圖片的移動范圍(super(context);this.setPadding(0,0,0,0);screenW=w;screenH=h;/用來計算2個觸摸點的距離這里傳進來的w,hprivatefloatspacing(MotionEventevent)floatx=event.getX(0)-event.getX(1);floaty=event.getY(0)-event.getY(l);returnFloatMath.sqrt(x*x+y*y);Ov

13、erridepublicbooleanonTouchEvent(MotionEventevent)switch(event.getAction()&MotionEvent.ACTION_MASK)MotionEvent.ACTION_MASKft示多點觸控事件caseMotionEvent.ACTION_DOWN:mode=DRAG;stop_x=(int)event.getRawX();/為原點的坐標stop_y=(int)event.getRawY();/start_x=stop_x-this.getLeft();/表示相對于屏幕左上角同上用(int)event.getX();一樣

14、,表示相對于當前點擊Widget(控件)左上角的坐標,這里就是相對于自定義imageView左上角的坐標.建議用前者, 如果不是全屏拖動, 而是指定范圍內(nèi),一樣適用!start_y=stop_y-this.getTop();/用(int)event.getY();一樣,this.getTop()表示其頂部相對于父控件的距離if(event.getPointerCount()=2)beforeLenght=spacing(event);break;caseMotionEvent.ACTION_POINTER_DOWN:if(spacing(event)10f)mode=ZOOM;beforeLe

15、nght=spacing(event);break;caseMotionEvent.ACTIONUP:intdisX=0;intdisY=0;if(getHeight()=screenH)/(if(this.getTop()=screenH)(disY=getHeight()-screenH+getTop();this.layout(this.getLeft(),screenH-getHeight(),this.getRight(),screenH);elseintY1=getTop();intY2=getHeight()-screenH+getTop();if(Y10)disY=Y1;thi

16、s.layout(this.getLeft(),0,this.getRight(),0+this.getHeight();elseif(Y20)disY=Y2;this.layout(this.getLeft(),screenH-getHeight(),this.getRight(),screenH);if(getWidth()=screenW)if(this.getLeft()screenW)disX=getWidth()-screenW+getLeft();this.layout(screenW-getWidth(),this.getTop(),screenW,this.getBottom

17、();)elseintX1=getLeft();intX2=getWidth()-screenW+getLeft();if(X10)disX=X1;this.layout(0,this.getTop(),0+getWidth(),this.getBottom();elseif(X20)disX=X2;this.layout(screenW-getWidth(),this.getTop(),screenW,this.getBottom();/如果圖片縮放到寬高任意一個小于100,那么自動放大,直到大于100.while(getHeight()100|getWidth()10f)afterLeng

18、ht=spacing(event);floatgapLenght=afterLenght-beforeLenght;if(gapLenght=0)break;/圖片寬度(也就是自定義imageView)必須大于70才可以縮放elseif(Math.abs(gapLenght)5f&getWidth()70)if(gapLenght0)this.setScale(scale,BIGGER);elsethis.setScale(scale,SMALLER);beforeLenght=afterLenght;/這句不能少。break;returntrue;privatevoidsetScale(floattemp,intflag)if(flag=BIGGER)setFrame(left,top,right,bottom)函數(shù)表示改變當前view的框架,也就是大小。this.setFrame(this.getLeft()-(int)(temp*this.getWidth(),this.getTop()-(int)(temp*this.getHeight(),this.getRight()+(int)(temp*this.getWidth(),this.getBottom()+(int)(temp*this.getHeight();elseif(flag=SMALLER

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論