drawble 的使用

来源:互联网 发布:js 添加dom 动画 编辑:程序博客网 时间:2024/06/05 03:42

在实际需求中 遇到 要实现这样的效果
这里写图片描述

这样的效果,一个带有渐变效果的文案和文字 和图片,当文字的数量超过一行的效果为:
这里写图片描述

实现的思路 是将 高档型 和品牌秀这几个图标作为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) {                    }                });

按照手机屏幕的比例拉伸

参考资料
http://www.jianshu.com/p/384a70897ba6

原创粉丝点击