在实际需求中 遇到 要实现这样的效果
这样的效果,一个带有渐变效果的文案和文字 和图片,当文字的数量超过一行的效果为:
实现的思路 是将 高档型 和品牌秀这几个图标作为ImageSpan 在TextView 显示的时候作为占位符置换
具体的实现代码为:
private void refreshHotelName(HotelDetailCacheBean cacheBean) {
Drawable medalDrawable = null;
mHotelNameText.setCompoundDrawables(null, null, null, null);
mHotelNameText.setMaxLines(3);
mHotelNameText.setSingleLine(false);
HotelBasicInfoEntityModel hotelBasicInfoModel = cacheBean.hotelBasicInfoModel;
int medalValue = getMedalType(hotelBasicInfoModel);
if (medalValue > 0) {
int drawableID = HotelConstant.sMedalTypeResIds.get(medalValue);
mResource = mFragment.getResources();
medalDrawable = mResource.getDrawable(drawableID);
}
Drawable sellerDrawable = mFragment.getResources().getDrawable(R.drawable.hotel_icon_show);
Drawable hotelTypeDrawable = LayoutToDrawable(cacheBean);
SpannableStringBuilder span = new SpannableStringBuilder();
String hotelTypeTag = "✹";
String medalTag = "●";
String sellerTag = "★";
String hotelName = cacheBean.hotelBasicInfoModel.hotelName.trim();
String star = HotelUtils.getHotelShowStarShort(cacheBean.hotelDataType, cacheBean.hotelActiveInfoModel.isLicenseStar, cacheBean.hotelActiveInfoModel.starEType.getValue(),true).trim();
if (!StringUtil.emptyOrNull(star)) {
span.append(hotelTypeTag);
span.append(" ");
}
span.append(hotelName);
if (medalDrawable != null) {
span.append(" ");
span.append(medalTag);
}
if (!StringUtil.emptyOrNull(cacheBean.hotelBasicInfoModel.sellerShowUrl)) {
span.append(" ");
span.append(sellerTag);
}
Pattern hotelTypePattern = Pattern.compile(hotelTypeTag);
Matcher hotelTypeMatcher = hotelTypePattern.matcher(span);
while (hotelTypeDrawable != null && hotelTypeMatcher.find()) {
hotelTypeDrawable.setBounds(0, 0, (int) drableWidth, DeviceInfoUtil.getPixelFromDip(16));
span.setSpan(new HotelImageSpan(hotelTypeDrawable), hotelTypeMatcher.start(), hotelTypeMatcher.end(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}
Pattern pattern = Pattern.compile(medalTag);
Matcher matcher = pattern.matcher(span);
while (medalDrawable != null && matcher.find()) {
medalDrawable.setBounds(0, 0, DeviceInfoUtil.getPixelFromDip(16), DeviceInfoUtil.getPixelFromDip(16));
span.setSpan(new HotelImageSpan(medalDrawable), matcher.start(), matcher.end(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}
Pattern patternSeller = Pattern.compile(sellerTag);
Matcher matcherSeller = patternSeller.matcher(span);
while (sellerDrawable != null && matcherSeller.find()) {
sellerDrawable.setBounds(0, 0, DeviceInfoUtil.getPixelFromDip(16), DeviceInfoUtil.getPixelFromDip(16));
span.setSpan(new HotelImageSpan(sellerDrawable), matcherSeller.start(), matcherSeller.end(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}
mHotelNameText.setText(span);
}
对于 高档型这个文案 的处理思路是将TextView 转换drawable
实现代码如下
public Drawable LayoutToDrawable(HotelDetailCacheBean cacheBean) {
LayoutInflater inflator = CtripBaseApplication.getInstance().getCurrentActivity().getLayoutInflater();
View viewHelp = inflator.inflate(R.layout.hotel_detail_high_star_style_layout, null);
TextView textView = (TextView) viewHelp.findViewById(R.id.hotel_type);
String star = HotelUtils.getHotelShowStarShort(cacheBean.hotelDataType, cacheBean.hotelActiveInfoModel.isLicenseStar, cacheBean.hotelActiveInfoModel.starEType.getValue(),true).trim();
if (!StringUtil.emptyOrNull(star)) {
textView.setText(star);
}
Bitmap snapshot = convertViewToBitmap(textView);
Drawable drawable = new BitmapDrawable(snapshot);
return drawable;
}
public static Bitmap convertViewToBitmap(TextView view) {
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
drableWidth = view.getPaint().measureText(view.getText().toString());
view.layout(0, 0, (int) drableWidth + 8, view.getMeasuredHeight()); //根据字符串的长度显示view的宽度
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
2 在实际项目中,有时候想让图片等比拉伸,大部分人会想着imageView 的setScrtype FitXY 在源码中的
private void configureBounds() {
//通过src生成的Drawable实例 原始宽高
final int dwidth = mDrawableWidth;
final int dheight = mDrawableHeight;
//ImageView实例的内容区域宽高(去除了padding值)
final int vwidth = getWidth() - mPaddingLeft - mPaddingRight;
final int vheight = getHeight() - mPaddingTop - mPaddingBottom;
****
if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == mScaleType) {
//当ImageView设置过android:scaleType="fitXY" 或setScaleType(ScaleType.FIT_XY),
//则将此Drawable实例的绘制范围设定为ImageView实例的内容区域
mDrawable.setBounds(0, 0, vwidth, vheight);
mDrawMatrix = null;
} else {
//对应我们例子中,未设置android:scaleType情况下,
//通过src生成的Drawable实例的绘制范围就是其原始范围
mDrawable.setBounds(0, 0, dwidth, dheight);
//下面代码设置了mDrawMatrix的属性
//在initImageView()方法中已知:
//ImageView中mScaleType默认就是ScaleType.FIT_CENTER
if (ScaleType.MATRIX == mScaleType) {
****
} else if (fits) {
****
} else if (ScaleType.CENTER == mScaleType) {
****
} else if (ScaleType.CENTER_CROP == mScaleType) {
****
} else if (ScaleType.CENTER_INSIDE == mScaleType) {
****
} else {
//ImageView中mScaleType默认就是ScaleType.FIT_CENTER
//则根据ImageView实例内容区域的范围和Drawable实例实际宽高来设置mDrawMatrix
mTempSrc.set(0, 0, dwidth, dheight);
mTempDst.set(0, 0, vwidth, vheight);
mDrawMatrix = mMatrix;
mDrawMatrix.setRectToRect(mTempSrc, mTempDst, scaleTypeToScaleToFit(mScaleType));
}
}
}
}
在fitly 是按照控件的宽和高 拉伸 会变型,解决方案
ImageLoader.getInstance().loadImage(imageUrl, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
}
@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
if (bitmap != null && !bitmap.isRecycled()) {
int width = CtripAppController.getWindowWidth();
int btWitdth = bitmap.getWidth();
int btHeight = bitmap.getHeight();
int height = (width * btHeight) / btWitdth;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height);
mImageView.setLayoutParams(params);
mImageView.setImageBitmap(bitmap);
}
}
@Override
public void onLoadingCancelled(String s, View view) {
}
});
按照手机屏幕的比例拉伸