当前位置: 首页 > 科技观察

可伸缩头像QQ空间

时间:2023-03-21 22:58:38 科技观察

源码介绍:仿QQ空间可伸头,经典好用,值得一试。源码效果:源码片段:packagecom.example.tz_demo_6_27;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.animation.Animation;importandroid.view。动画片。Transformation;importandroid.widget.ImageView;importandroid.widget.ImageView.ScaleType;importandroid.widget.ListView;publicclassParallaxListViewextendsListView{privateImageViewmImageView;//初始高度privateintmImageViewHeight=-1;//***拉伸高度privateintmDrawableMaxHeight=-1;publicParallaxListView(Contextcontext,AttributeSetattrs){super(context,attrs);}/***设置拉伸图片**@paramimageView*/publicvoidsetParallaxImageView(ImageViewimageView){this.mImageView=imageView;//设置拉伸类型--centerfillthis.mImageView.setScaleType(ScaleType.CENTER_CROP);}/***初始化加载图片的初始高度**/publicvoidsetViewBounds(){if(mImageViewHeight==-1){mImageViewHeight=mImageView.getHeight();if(mImageViewHeight<0){mImageViewHeight=getContext().getResources().getDimensionPixelSize(R.dimen.size_default);}}}/***滑过头部时的回调*/@OverrideprotectedbooleanoverScrollBy(intdeltaX,intdeltaY,intscrollX,intscrollY,intscrollRangeX,intscrollRangeY,intmaxOverScrollX,intmaxOverScrollY,booleanisTouchEvent){//controlImageView高度继续增加booleanisCollapse=resizeOverScrollBy(deltaY);//returntrue:下拉到边框某个地方时,不再下拉returnisCollapse?true:super.overScrollBy(deltaX,deltaY,scrollX,scrollY,scrollRangeX,scrollRangeY,maxOverScrollX,maxOverScrollY,isTouchEvent);}/***监听ListView滑动*/@OverrideprotectedvoidonScrollChanged(intl,intt,intoldl,intoldt){super.onScrollChanged(l,t,oldl,oldt);//获取父控件ViewheaderofImageView=(View)mImageView.getParent();if(header.getTop()<0&&mImageView.getHeight()>mImageViewHeight){//降低ImageView的高度--不能超过图片原来的高度mImageView.getLayoutParams().height=数学。max(mImageView.getHeight()+header.getTop(),mImageViewHeight);//ImageView所在容器的高度也要变化:getTop--->0header.layout(header.getLeft(),0,header.getRight(),header.getHeight());米姆ageView.requestLayout();}}privatebooleanresizeOverScrollBy(intdeltaY){//下拉过程中,不断控制ImageView的高度/***deltaY:是滑动超过时每毫秒的滑动距离--increment(-toPull-downtransition,+pull-uptransition)size:根据用户的滑动速度,一般滑动速度确定*-50~50*/if(deltaY<0){//下拉过渡,连续增加ImageView的高度,deltay为负数,增加高度就是减去mImageView.getLayoutParams().height=mImageView.getHeight()-deltaY;//View重新调整宽高mImageView.requestLayout();//onMeasure-->onLayout}else{//上拉过渡,不断降低ImageView的高度,deltay为正数,降低高度或减去if(mImageView.getHeight()>mImageViewHeight){mImageView.getLayoutParams().height=Math.max(mImageView.getHeight()-deltaY,mImageViewHeight);//View重新调整mImage的宽高View.requestLayout();//onMeasure-->onLayout}}returnfalse;}/***监听touch--松手*/@OverridepublicbooleanonTouchEvent(MotionEventev){//判断if(ev.getAction()==MotionEvent.ACTION_UP){//开启回弹动画ResetAnimationanimation=newResetAnimation(mImageView,mImageViewHeight);animation.setDuration(300);mImageView.startAnimation(animation);}returnsuper.onTouchEvent(ev);}publicclassResetAnimationextendsAnimation{privateImageViewmView;privateinttargetHeight;//动画执行前的高度privateintextraHeight;//高度差privateintextraHeight;publicResetAnimation(ImageViewmImageView,inttargetHeight){this.mView=mImageView;this.targetHeight=targetHeight;this.originalHeight=mImageView.getHeight();extraHeight=originalHeight-targetHeight;}/***这个方法会在动画结束时回调连续执行*interpolatedTime:范围是0*0ms------------>300ms*当前图片高度-->动画执行前高度-高度差*interpolatedTime*extraHeight------>0*/@OverrideprotectedvoidapplyTransformation(floatinterpolatedTime,Transformationt){mView.getLayoutParams().height=(int)(originalHeight-extraHeight*interpolatedTime);mView.requestLayout();super.applyTransformation(interpolatedTime,t);}}}下载地址:http://down.51cto.com/data/2091668