How to make RelativeSizeSpan align to top

后端 未结 9 2100
情深已故
情深已故 2021-01-31 03:14

I have the following String RM123.456. I would like to

  • Make RM relatively smaller
  • Make RM aligned to to
9条回答
  •  独厮守ぢ
    2021-01-31 03:32

    I have implemented this in one of my application.

     
    

    In Activity/Frgament.class

     myTextView = (TextView) view.findViewById(R.id.txt_formatted_value);
    

    Hardcoded for testing purpose,

    String numberValue = "123.456";    
    myTextView.setText(UtilityClass.getFormattedSpannedString("RM"+numberValue,
         numberValue.length(),0));
    

    Add this class in your package,

    public class SuperscriptSpanAdjuster extends MetricAffectingSpan {
    double ratio = 0.5;
    
    public SuperscriptSpanAdjuster() {
    }
    
    public SuperscriptSpanAdjuster(double ratio) {
        this.ratio = ratio;
    }
    
    @Override
    public void updateDrawState(TextPaint paint) {
        paint.baselineShift += (int) (paint.ascent() * ratio);
    }
    
    @Override
    public void updateMeasureState(TextPaint paint) {
        paint.baselineShift += (int) (paint.ascent() * ratio);
    }
    

    }

    Created the format method in UntilityClass.class

     public static SpannableString getFormattedSpannedString(String value, int mostSignificantLength, int leastSignificantLength){
    
        SpannableString  spanString = new SpannableString(value);
        /* To show the text in top aligned(Normal)*/
        spanString.setSpan(new SuperscriptSpanAdjuster(0.7), 0,spanString.length()-mostSignificantLength-leastSignificantLength, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
        /* Show the number of characters is normal size (Normal)*/
        spanString.setSpan(new RelativeSizeSpan(1.3f), 0,spanString.length()-mostSignificantLength-leastSignificantLength, 0);
        /*To set the text style as bold(MostSignificant)*/
        //spanString.setSpan(new StyleSpan(Typeface.BOLD), spanString.length()-mostSignificantLength-leastSignificantLength, spanString.length()-leastSignificantLength, 0);
        /*To set the text color as WHITE(MostSignificant)*/
        //spanString.setSpan(new ForegroundColorSpan(Color.WHITE), spanString.length()-mostSignificantLength-leastSignificantLength,  spanString.length()-leastSignificantLength, 0);
        /*Show the number of characters as most significant value(MostSignificant)*/
        spanString.setSpan(new RelativeSizeSpan(2.3f), spanString.length()-mostSignificantLength-leastSignificantLength, spanString.length()-leastSignificantLength, 0);
    
        /* To show the text in top aligned(LestSignificant)*/
        spanString.setSpan(new SuperscriptSpanAdjuster(1.2), spanString.length()-leastSignificantLength, spanString.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
        /*To set the text style as bold(LestSignificant)*/
        //spanString.setSpan(new StyleSpan(Typeface.BOLD), spanString.length()-leastSignificantLength, spanString.length(), 0);
        /*Show the number of characters as most significant value(LestSignificant)*/
        spanString.setSpan(new RelativeSizeSpan(0.8f), spanString.length()-leastSignificantLength, spanString.length(), 0);
    
        return spanString;
    }
    

    Using this method you can do more circus like changing text style, color separately for SuperScript. Also you can add superscript both right and left side.(Here I commented all the code, if you want can give a try...)

提交回复
热议问题