/** * */ package com.socks.jiandan.view.floorview; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.socks.jiandan.R; import java.util.Iterator; /** * @author JohnnyShieh * @ClassName: FloorView * @Description: * @date Jan 25, 2014 2:09:36 PM */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class FloorView extends LinearLayout { private int density; private Drawable drawer; private SubComments datas; private SubFloorFactory factory; public FloorView(Context context) { super(context); init(context); } public FloorView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public FloorView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } public void setBoundDrawer(Drawable drawable) { drawer = drawable; } public void setComments(SubComments cmts) { datas = cmts; } public void setFactory(SubFloorFactory fac) { factory = fac; } public int getFloorNum() { return getChildCount(); } private void init(Context context) { this.setOrientation(LinearLayout.VERTICAL); density = (int) (3.0F * context.getResources().getDisplayMetrics().density); } public void init() { if (null == datas.iterator()) return; if (datas.getFloorNum() < 7) { for (Iterator<? extends Commentable> iterator = datas.iterator(); iterator .hasNext(); ) { View view = factory.buildSubFloor(iterator.next(), this); addView(view); } } else { View view; view = factory.buildSubFloor(datas.get(0), this); addView(view); view = factory.buildSubFloor(datas.get(1), this); addView(view); view = factory.buildSubHideFloor(datas.get(2), this); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TextView hide_text = (TextView) v .findViewById(R.id.hide_text); hide_text.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); v.findViewById(R.id.hide_pb).setVisibility(View.VISIBLE); removeAllViews(); for (Iterator<? extends Commentable> iterator = datas.iterator(); iterator .hasNext(); ) { View view = factory.buildSubFloor(iterator.next(), FloorView.this); addView(view); } reLayoutChildren(); } }); addView(view); view = factory.buildSubFloor(datas.get(datas.size() - 1), this); addView(view); } reLayoutChildren(); } public void reLayoutChildren() { int count = getChildCount(); for (int i = 0; i < count; i++) { View view = getChildAt(i); LayoutParams layout = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); layout.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; int margin = Math.min((count - i - 1), 4) * density; layout.leftMargin = margin; layout.rightMargin = margin; if (i == count - 1) { layout.topMargin = 0; } else { layout.topMargin = Math.min((count - i), 4) * density; } view.setLayoutParams(layout); } } @Override protected void dispatchDraw(Canvas canvas) { int i = getChildCount(); if (null != drawer && i > 0) { for (int j = i - 1; j >= 0; j--) { View view = getChildAt(j); drawer.setBounds(view.getLeft(), view.getLeft(), view.getRight(), view.getBottom()); drawer.draw(canvas); } } super.dispatchDraw(canvas); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (this.getChildCount() <= 0) { setMeasuredDimension(0, 0); return; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }