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

仿微信朋友圈动态内容全文显示与收起实现

2016-04-26 15:33 459 查看
前段时间在做项目的时候,产品有一个需求,要求动态的内容如果超过5行的话需要将超过5行的内容进行隐藏,点击全文的时候进行展示,点击收起进行隐藏,类似微信朋友圈的效果,当时在网上查找相关的资料发现了有一个博主(刘永雷)的一个案例,但是这种方式存在一些bug,例如会出现错位的问题,故采用如下方式进行实现:

当时在做这个功能的时候就发现,难点是获取文字对应的行数,同时发现以下方式获取的行数不准确:

/**

* 获取TextView的行数

*

* @param context

* @param textView

* @return

*/

public static int getLineNumber(Context context, TextView textView) {

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

int width = wm.getDefaultDisplay().getWidth();

int widthMeasure = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);

int heightMeasure = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);

textView.measure(widthMeasure, heightMeasure);

int lineHeight = textView.getLineHeight();

int lineNumber = textView.getMeasuredHeight() / lineHeight;

return lineNumber;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

以下方式获取的是正确的:

/**

* 计算出该TextView中文字的长度(像素)

*

* @param textView

* @param text

* @return

*/

public static int getTextViewLength(TextView textView, String text) {

TextPaint paint = textView.getPaint();

// 得到使用该paint写上text的时候,像素为多少

int textLength = (int) paint.measureText(text);

return textLength;

}

/**

* 根据手机的分辨率从 dp 的单位 转成为 px(像素)

*/

public static int dip2px(Context context, float dpValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (dpValue * scale + 0.5f);

}

/**

* 根据手机的分辨率从 px(像素) 的单位 转成为 dp

*/

public static int px2dip(Context context, float pxValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (pxValue / scale + 0.5f);

}

private int availableTextWidth;

// 获取屏幕的宽度减去TextView两边的间距,得到TextView的有效宽度(两行)

availableTextWidth = (MainActivity.screenWidth - dip2px(mContext, 28)) * 2;// 28是TextView的左边距和右边距之和

tv_content.setText(content);

if (availableTextWidth < getTextViewLength(tv_content, content)) {

tv_showorhide.setVisibility(View.VISIBLE);

if (!getItem(position).isShow) {

tv_showorhide.setText("全文");

tv_content.setEllipsize(TruncateAt.END);

tv_content.setMaxLines(2);

} else {

tv_content.setMaxLines(1024);

tv_showorhide.setText("收起");

}

tv_showorhide.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (tv_showorhide.getText().equals("全文")) {

tv_content.setMaxLines(1024);

tv_showorhide.setText("收起");

getItem(position).isShow = true;

} else {

tv_showorhide.setText("全文");

tv_content.setMaxLines(2);

getItem(position).isShow = false;

}

}

});

} else {

tv_showorhide.setVisibility(View.GONE);

}

这段代码是从Adapter中抽取出来的,即使使用布局复用,也不会出现错位现象。

注:初次写博客,写得有点乱,忘各位见谅,还请大家灵活应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: