drawble 的使用

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值