您的位置:首页 > 移动开发 > Android开发

Android ----可伸缩的控件

2016-05-03 10:16 411 查看
需求:财富界面的头布局可以下拉,并且它的背景是可伸缩的,其中控件也是要跟着进行动的.说到下拉就会想到:重写这个控件的onTouchEven事件,然后在moveUp 中写上控件的伸缩动画就OK了.

代码:

布局:

<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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: