您的位置:首页 > 其它

动态计算TextView宽度,点击展开更过,类似滴滴打车标题点击弹窗显示更多

2018-03-19 14:00 871 查看
项目需求:页面标题Title,一行文字,宽度固定,当文字过多时候就显示省略号,省略号右侧有下拉箭头图标,点击可以展开显示所有标题内容;当标题内容不超过固定宽度时候没有省略号,不可点击显示更过标题弹窗。







实现方法,计算title的TextView的宽度,如果宽度大于固定宽度就显示下拉箭头,代码:
xml代码:
<TextView
android:id="@+id/title_tv"
android:layout_width="@dimen/dp_150"
android:layout_height="@dimen/dp_50"
android:layout_centerHorizontal="true"
android:background="@color/transparent_background1"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:onClick="showPop"
android:textColor="#000000"
android:textSize="@dimen/sp_16"
android:textStyle="bold" />下拉窗口xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F8F8F8"
android:orientation="vertical">

<TextView
android:id="@+id/project_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_5"
android:layout_marginStart="@dimen/dp_5"
android:gravity="center"
android:minHeight="@dimen/dp_40"
android:textColor="@color/black"
android:textSize="@dimen/sp_16"
android:background="@drawable/shape_spinner_list"/>
</LinearLayout>
java代码:
private TextView mTitleTv;
private boolean isEllipsis = false;//标题是否有省略号
private CommonPopupWindow mPopupWindow;
//文字过多显示点击展开更多
private void setTextMore() {
TextPaint paint = mTitleTv.getPaint();
paint.setTextSize(mTitleTv.getTextSize());
//文本所占宽度
float measureText = paint.measureText(mTitleTv.getText().toString());
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.more);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
if (measureText > ImageUtils.dp2px(this, 150)) {
mTitleTv.setCompoundDrawables(null, null, drawable, null);
isEllipsis = true;
} else {
mTitleTv.setCompoundDrawables(null, null, null, null);
isEllipsis = false;
}
}
public void showPop(View view) {
if (mPopupWindow != null && mPopupWindow.isShowing()) return;
if (!isEllipsis) return;
mPopupWindow = new CommonPopupWindow.Builder(this)
.setView(R.layout.popup_down)
.setWidthAndHeight(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
.setAnimationStyle(R.style.AnimDown)
//                .setBackGroundLevel(0.5f)
.setViewOnclickListener(this)
.setOutsideTouchable(true)
.create();
mPopupWindow.showAsDropDown(view, 0, 0);
}
@Override
public void getChildView(View view, int layoutResId) {
switch (layoutResId) {
case R.layout.popup_down:
TextView projectName = (TextView) view.findViewById(R.id.project_name);
projectName.setText(mMyCompanyName);
break;
}
}
popupwindow代码:
public class CommonPopupWindow extends PopupWindow {
private final PopupController controller;

@Override
public int getWidth() {
return controller.mPopupView.getMeasuredWidth();
}

@Override
public int getHeight() {
return controller.mPopupView.getMeasuredHeight();
}

public interface ViewInterface {
void getChildView(View view, int layoutResId);
}

private CommonPopupWindow(Context context) {
controller = new PopupController(context, this);
}

@Override
public void dismiss() {
super.dismiss();
controller.setBackGroundLevel(1.0f);
}

public static class Builder {
private final PopupController.PopupParams params;
private ViewInterface listener;

public Builder(Context context) {
params = new PopupController.PopupParams(context);
}

/**
* @param layoutResId 设置PopupWindow 布局ID
* @return Builder
*/
public Builder setView(int layoutResId) {
params.mView = null;
params.layoutResId = layoutResId;
return this;
}

/**
* @param view 设置PopupWindow布局
* @return Builder
*/
public Builder setView(View view) {
params.mView = view;
params.layoutResId = 0;
return this;
}

/**
* 设置子View
*
* @param listener ViewInterface
* @return Builder
*/
public Builder setViewOnclickListener(ViewInterface listener) {
this.listener = listener;
return this;
}

/**
* 设置宽度和高度 如果不设置 默认是wrap_content
*
* @param width 宽
* @return Builder
*/
public Builder setWidthAndHeight(int width, int height) {
params.mWidth = width;
params.mHeight = height;
return this;
}

/**
* 设置背景灰色程度
*
* @param level 0.0f-1.0f
* @return Builder
*/
public Builder setBackGroundLevel(float level) {
params.isShowBg = true;
params.bg_level = level;
return this;
}

/**
* 是否可点击Outside消失
*
* @param touchable 是否可点击
* @return Builder
*/
public Builder setOutsideTouchable(boolean touchable) {
params.isTouchable = touchable;
return this;
}

/**
* 设置动画
*
* @return Builder
*/
public Builder setAnimationStyle(int animationStyle) {
params.isShowAnim = true;
params.animationStyle = animationStyle;
return this;
}

public CommonPopupWindow create() {
final CommonPopupWindow popupWindow = new CommonPopupWindow(params.mContext);
params.apply(popupWindow.controller);
if (listener != null && params.layoutResId != 0) {
listener.getChildView(popupWindow.controller.mPopupView, params.layoutResId);
}
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
popupWindow.controller.mPopupView.measure(w, h);
return popupWindow;
}
}
}
class PopupController {
private int layoutResId;//布局id
private Context context;
private PopupWindow popupWindow;
View mPopupView;//弹窗布局View
private View mView;
private Window mWindow;

PopupController(Context context, PopupWindow popupWindow) {
this.context = context;
this.popupWindow = popupWindow;
}

public void setView(int layoutResId) {
mView = null;
this.layoutResId = layoutResId;
installContent();
}

public void setView(View view) {
mView = view;
this.layoutResId = 0;
installContent();
}

private void installContent() {
if (layoutResId != 0) {
mPopupView = LayoutInflater.from(context).inflate(layoutResId, null);
} else if (mView != null) {
mPopupView = mView;
}
popupWindow.setContentView(mPopupView);
}

/**
* 设置宽度
*
* @param width  宽
* @param height 高
*/
private void setWidthAndHeight(int width, int height) {
if (width == 0 || height == 0) {
//如果没设置宽高,默认是WRAP_CONTENT
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
} else {
popupWindow.setWidth(width);
popupWindow.setHeight(height);
}
}

/**
* 设置背景灰色程度
*
* @param level 0.0f-1.0f
*/
void setBackGroundLevel(float level) {
mWindow = ((Activity) context).getWindow();
WindowManager.LayoutParams params = mWindow.getAttributes();
params.alpha = level;
mWindow.setAttributes(params);
}

/**
* 设置动画
*/
private void setAnimationStyle(int animationStyle) {
popupWindow.setAnimationStyle(animationStyle);
}

/**
* 设置Outside是否可点击
*
* @param touchable 是否可点击
*/
private void setOutsideTouchable(boolean touchable) {
popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));//设置透明背景
popupWindow.setOutsideTouchable(touchable);//设置outside可点击
popupWindow.setFocusable(touchable);
}

static class PopupParams {
public int layoutResId;//布局id
public Context mContext;
public int mWidth, mHeight;//弹窗的宽和高
public boolean isShowBg, isShowAnim;
public float bg_level;//屏幕背景灰色程度
public int animationStyle;//动画Id
public View mView;
public boolean isTouchable = true;

public PopupParams(Context mContext) {
this.mContext = mContext;
}

public void apply(PopupController controller) {
if (mView != null) {
controller.setView(mView);
} else if (layoutResId != 0) {
controller.setView(layoutResId);
} else {
throw new IllegalArgumentException("PopupView's contentView is null");
}
controller.setWidthAndHeight(mWidth, mHeight);
controller.setOutsideTouchable(isTouchable);//设置outside可点击
if (isShowBg) {
//设置背景
controller.setBackGroundLevel(bg_level);
}
if (isShowAnim) {
controller.setAnimationStyle(animationStyle);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: