Android ----可伸缩的控件
2016-05-03 10:16
411 查看
需求:财富界面的头布局可以下拉,并且它的背景是可伸缩的,其中控件也是要跟着进行动的.说到下拉就会想到:重写这个控件的onTouchEven事件,然后在moveUp 中写上控件的伸缩动画就OK了.
代码:
布局:
这是在触摸后的效果图,可以看出Relativelayout是可以伸缩,宽高都要进行变化,但是RelativeLayout如果外层包裹的还是Relativelayout的话,那么他只能是纵向拉伸,不能横向拉伸.所以RelativeLayout外层只能包裹LinearLayout.
代码:
布局:
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RelativeLayout android:id="@+id/rl_wealth" android:layout_width="match_parent" android:layout_height="@dimen/dp_210" android:layout_gravity="center" android:background="@mipmap/beijing" android:scaleType="centerCrop"> <RelativeLayout android:id="@+id/rl_edit" android:layout_width="match_parent" android:layout_height="30dp" android:layout_marginTop="@dimen/dp_35" android:layout_marginRight="@dimen/dp_20" > <ImageView android:id="@+id/pic_edit" android:layout_width="@dimen/dp_20" android:layout_alignParentRight="true" android:layout_height="@dimen/dp_30" android:src="@mipmap/bianji" /> </RelativeLayout> <LinearLayout android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginBottom="@dimen/dp_48" android:orientation="vertical"> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/iv_head_icon" android:layout_width="@dimen/dp_57" android:layout_height="@dimen/dp_57" android:src="@mipmap/weidenglu" android:layout_gravity="center_horizontal" app:civ_border_color="#fff" app:civ_border_width="@dimen/dp_1" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_16" android:gravity="center" android:orientation="horizontal"> <TextView android:id="@+id/tv_wealth_nickname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="马上登陆" android:textColor="#fff" android:textSize="@dimen/wealth_itemText_textsize" /> <ImageView android:id="@+id/iv_wealth_sex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/dp_5" android:src="@mipmap/xignbie_nan" /> <ImageView android:id="@+id/iv_dengji_wel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/dp_5" android:src="@mipmap/dengji_" /> </LinearLayout> </LinearLayout> </RelativeLayout> </LinearLayout>后台代码:
@Override public View initView() { view =View.inflate(UIUtils.getContext(), R.layout.frag_wealth,null); ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) rl_header.getLayoutParams(); lp.width = metric.widthPixels; lp.height= metric.widthPixels*9/16; rl_header.setLayoutParams(lp); return view; } //监听onTouch, private void scrollTouch(){ scrollView.setOnTouchListener(new View.OnTouchListener() { @SuppressLint({ "ClickableViewAccessibility", "NewApi" }) @Override public boolean onTouch(View v, MotionEvent event) { ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) rl_header.getLayoutParams(); RelativeLayout .LayoutParams dit = (RelativeLayout.LayoutParams) rl_edit.getLayoutParams(); switch (event.getAction()){ case MotionEvent.ACTION_UP: mScaling = false; replyImage(); break; case MotionEvent.ACTION_MOVE: if(!mScaling) { if (scrollView.getScrollY() == 0) { mFirstPosition = event.getY(); } else { break; } } int distance = (int)((event.getY()-mFirstPosition)*0.6); if(distance<0){ break; } mScaling=true; lp.width=metric.widthPixels+distance; //改变width 和height lp.height=(metric.widthPixels+distance)*9/16; rl_header.setLayoutParams(lp); dit.rightMargin=(distance+40)*9/16; rl_edit.setLayoutParams(dit); return true; } return false; } }); } //动画,在不触摸的时候动画回弹 @SuppressLint("NewApi") public void replyImage(){ final ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) rl_header.getLayoutParams(); final RelativeLayout .LayoutParams dit = (RelativeLayout.LayoutParams) rl_edit.getLayoutParams(); final float dit_w = rl_edit.getLayoutParams().width; final float dit_h = rl_edit.getLayoutParams().height; final float w= rl_header.getLayoutParams().width; final float h = rl_header.getLayoutParams().height; final float newW= metric.widthPixels; final float newH = metric.widthPixels*9/16; ValueAnimator anim = ObjectAnimator.ofFloat(0.0f,1.0f).setDuration(200); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float cVal = (Float) animation.getAnimatedValue(); lp.width = (int) (w - (w - newW) * cVal); lp.height = (int) (h - (h - newH) * cVal); rl_header.setLayoutParams(lp); dit.rightMargin=40; rl_edit.setLayoutParams(dit); } }); anim.start(); }效果图:
这是在触摸后的效果图,可以看出Relativelayout是可以伸缩,宽高都要进行变化,但是RelativeLayout如果外层包裹的还是Relativelayout的话,那么他只能是纵向拉伸,不能横向拉伸.所以RelativeLayout外层只能包裹LinearLayout.
相关文章推荐
- AndroidStudio插件GsonFormat快速实现JavaBean
- 简单的Android RecyclerView 使用小Demo
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android开发中,那些让你相见恨晚的方法、类或接口
- Android Studio 关联Android源码
- 04Android Studio常见错误解决(本文不定时更新)
- Android常用第三方支付
- Android development tools line_endings hacking
- RxAndroid简单入门。
- Service概要
- 【项目源码】- 【局域网聊天】android实现局域网聊天 - UDP实现
- 关于android增添第三方字体的方法
- 10个你可能不知道的 Android Studio技巧
- android开发中的常见错误
- Android Xutils 框架
- 实现Android通知栏进度条效果
- Android Service相关知识
- Android性能优化典范(二)
- Android性能优化典范(一)
- Android *** android-doc阅读《进程与线程》