




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、android 自定义 ImageView 实现缩放,回弹效果androidimageview缩放回弹话不多说上代码:MainActivity.javapublicclassMainActivityextendsActivityprivateLinearLayoutll_viewArea;privateLinearLayout.LayoutParamsparm;privateViewAreaviewArea;OverridepublicvoidonCreate(BundlesavedinstanceState)super.onCreate(savedinstanceState);/去除titl
2、erequestWindowFeature(Window.FEATURE_NO_TITLE);/去掉Activity上面的状态栏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和状态栏两句代码必须放到setContentView(R.layout.main);话的前面。 而且这两句话必须有, 因为后面计算回弹距离是根据全屏计算的(我的i9000就是480
4、x800),如果不去掉title和状态栏, 后面的回弹会有误差,总是回弹不到想要的位置。下面看看ViewArea.java文件。 就是用来存放和初始化自定义imageView的地方。 将来的自定义ImageView被限制在其内部移动缩放。publicclassViewAreaextendsFrameLayout/前面说了ViewArea是一个布局,所以这里当然要继承一个布局了。LinearLayout也可以privateintimgDisplayW;privateintimgDisplayH;privateintimgW;privateintimgH;privateTouchViewtouch
5、View;privateDisplayMetricsdm;/resid为图片资源idpublicViewArea(Contextcontext,intresid)/第二个参数是图片的资源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;/下面的代码是判断图片初始显示样式的,当然可以根据你的想法随意显示,我这里是将宽大于高的图片按照宽缩小的比例把高压缩,前提必须是宽度超出了屏幕大小,相反,如果高大于宽,我将图片按照高缩小的比例把宽压缩,前提必须是高度超出了屏幕大小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的好处是, 如果压缩后的图片扔有一个边大于屏幕,那么只显示在屏幕内的部分,可以通过移动后看见外部(不会裁剪掉图片),如果采用RelativeLayout布局,图片会始终完整显示在屏幕内部,不会有超出屏幕的现象。如果图片不是完全占满屏幕,那么在屏幕上没有图片的地方拖动,图片也会移动,这样的体验不太好,建议用FreamLayout或者LinearLayout。touchView.setLayoutParams(newFrameLayout.LayoutParams(layout_w,la
10、yout_h);/这是自定义imageView的大小,也就是触摸范围一一this.addView(touchView);)ImageView.java是不是等了很久?!publicclassTouchViewextendsImageViewstaticfinalintNONE=0;/表示当前没有状态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表小当前处于移动状态表示当前处于缩放状态表示放大图片表小缩小图片用于标示当前处于什么状
12、态第一次触摸两点的距离移动后两点的距离缩放因子回弹动画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左上角的坐标.建议用前者, 如果不是全屏拖动, 而是指定范围内,一样适用!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)函数表示改变当前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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《机器学习技术应用》课件-pro1-1-1 校园消费数据分析流程的设计
- 《行业会计实务》课件-项目四 4.4.2 周转房的核算
- 吻合口溃疡的临床护理
- 组织新质生产力活动
- 2025年二手车交易合同范本
- 2025年监理工程师之合同管理综合检测试卷B卷含答案
- 2025年一级建造师之一建矿业工程实务押题练习试题A卷含答案
- 2025年房地产经纪人之业务操作基础试题库和答案要点
- 2025中外合作企业合同及章程详解
- 顺向型房室折返性心动过速的临床护理
- GB/T 14975-2012结构用不锈钢无缝钢管
- DB21-T3683-2022医疗卫生机构医疗废物卫生管理规范
- GB 17957-2021凿岩机械与气动工具安全要求
- 部编版六年级语文下册期末专项复习:修辞手法
- 中药学-七版教材
- 红军五次反围剿课件
- ISO9001注册审核员专业划分小类
- 五年级道德与法治上册课件 -保家卫国 独立自主 部编版 (共48张PPT)
- 安徽省历年中考数学试卷,2014-2021年安徽中考数学近八年真题汇总(含答案解析)
- 利益冲突申报表
- 项目工作周报模板
评论
0/150
提交评论