问题
I am measuring a string text to see if I should add a \n
for wrapping.
I am using the Paint.measureText
function, and it works most of the time but it occurs to me that this isn't accurate since a px doesn't equal a dp - I've seen online how to convert pixels to dp, but instead what I would rather do is convert px to a percentage of the screen size for example
If a
is 8 pixels wide, how would I say:
float LetterWidthPercent = _______ //get width of character in percent of screen width
float LetterHeightPercent = _______ //get height of character in percent of screen height
This way I could just see:
if (LineOfTextWidth >= ScreenWidth * 0.9f) //90%
This would be an extremely useful function to have handy.
回答1:
You will need to get the screen width through DisplayMetrics or how ever...
For getting the character size use paint with bounds to calculate.
characterWidth/screenWidth = characterScreenPercentage
I made it a double but you can easily change it to a float.
For Characters:
public Double characterToScreenWidthPercentage(Character c) {
Paint paint = new Paint();
Rect boundA = new Rect();
DisplayMetrics metrics = new DisplayMetrics();
((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getMetrics(metrics);
paint.getTextBounds(Character.toString(c), 0, 1, boundA);
Log.v("fn", Integer.toString(boundA.width()));
Log.v("fn", Integer.toString(metrics.widthPixels));
Log.v("fn", Double.toString((float) boundA.width() / (float) metrics.widthPixels));
return ((double) boundA.width() / (double) metrics.widthPixels);
}
For strings:
public Double stringToScreenWidthPercentage(String str) {
Paint paint = new Paint();
Rect boundA = new Rect();
DisplayMetrics metrics = new DisplayMetrics();
((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getMetrics(metrics);
paint.getTextBounds(str, 0, 1, boundA);
Log.v("fn", Integer.toString(boundA.width()));
Log.v("fn", Integer.toString(metrics.widthPixels));
Log.v("fn", Double.toString((float) boundA.width() / (float) metrics.widthPixels));
return ((double) boundA.width() / (double) metrics.widthPixels);
}
回答2:
public static double measureWeightPercent(Context context, String textToMeasure) {
DisplayMetrics metrics = new DisplayMetrics();
((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getMetrics(metrics);
TextView view = new TextView(context);
view.setText(textToMeasure);
view.measure(metrics.widthPixels, metrics.heightPixels);
double textWidth = view.getMeasuredWidth();
return textWidth / (metrics.widthPixels / 100);
}
You can measure a TextView with text inside before(or instead) drawing it on a screen. At this way you can set any font or textSize for TextView and always know how many percents the text will have on the screen.
回答3:
You can use following methods to convert do to pixel and pixel to dp.
Convert dp to pixel:
public int dpToPixel(int dp) {
DisplayMetrics dm= getContext().getResources().getDisplayMetrics();
int pixel = Math.round(dp * (dm.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return pixel
}
Convert pixel to dp:
public int pixelToDp(int pixel) {
DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
int dp = Math.round(pixel / (dm.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return dp;
}
来源:https://stackoverflow.com/questions/7429033/how-to-convert-text-width-in-pixels-to-percent-of-screen-width-height