动态计算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代码:
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;
}
}
}
实现方法,计算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); } } } }
相关文章推荐
- Android 中Textview内容长度一行无法显示时,末端省略,点击后可展开显示
- textview内容过多显示省略号,点击展开全部
- textview最多显示3行点击事件展开显示全部
- 可以点击显示更多的textview
- android ExpandableTextView-自定义可以动态展开/收缩显示长文本的TextView
- android ExpandableTextView-自定义可以动态展开/收缩显示长文本的TextView
- 动态设置TextView的高度,就是点击收起和展示更多的效果
- Android中SpannableString学习以及实现自定义TextView的显示更多(展开)和收起功能
- Android 自定义控件TextView点击显示更多
- Android 如何根据设置文字大小动态计算TextView长度、动态设置Relativelayout布局
- 动态设置TextView高度和宽度
- Android TextView内容过长加省略号,点击显示全部内容
- ListView 在getView()中设置一个item中的TextView的动态显示出现其它的也显示的bug解决方法
- Android RichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)
- 计算textview 文字宽度
- 计算动态字符串宽度,多行实现展开收起
- android textview 中超出屏幕宽度的字符 省略号显示
- TextView属性android:ellipsize实现跑马灯效果,TextView内容过长加省略号,点击显示全部内容
- Android TextView内容过长加省略号,点击显示全部内容
- Android TextView内容过长加省略号,点击显示全部内容