Используйте этот пользовательский ImageView в Xml
public class RoundedCornerImageView extends ImageView {
public RoundedCornerImageView(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
int w = getWidth(), h = getHeight();
Bitmap roundBitmap = getRoundedCroppedBitmap(bitmap, w);
canvas.drawBitmap(roundBitmap, 0, 0, null);
}
public static Bitmap getRoundedCroppedBitmap(Bitmap bitmap, int radius) {
Bitmap finalBitmap;
if (bitmap.getWidth() != radius || bitmap.getHeight() != radius)
finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius,
false);
else
finalBitmap = bitmap;
Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(),
finalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, finalBitmap.getWidth(),
finalBitmap.getHeight());
final RectF rectf = new RectF(0, 0, finalBitmap.getWidth(),
finalBitmap.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor("#BAB399"));
//Set Required Radius Here
int yourRadius = 7;
canvas.drawRoundRect(rectf, yourRadius, yourRadius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(finalBitmap, rect, rect, paint);
return output;
}
}
. Я действительно думаю, что это неизбежное зло, которое я часто использовал. Что-то неприятное, что я делаю, это:
// "{0}{1}{2}: Some message. Some percentage: {3}%"
string someString = string.Format(Properties.Resources.SomeString
,token1, token2, token3, number);
... по крайней мере, пока код не станет достаточно стабильным, чтобы я мог смутиться, увидев это другими.
Есть несколько причин, по которым вы захотите это сделать, но единственная серьезная причина - если вы собираетесь локализовать свое приложение на другой язык.
Если вы используете строки ресурсов, следует помнить о нескольких вещах.
По возможности включайте строки формата в набор строк ресурсов, которые вы хотите локализовать. Это позволит переводчику изменить порядок расположения отформатированных элементов, чтобы они лучше соответствовали контексту переведенного текста.
Избегайте наличия строк в ваших токенах формата, которые находятся на вашем языке. Лучше использовать
это для чисел. Например, сообщение:
«Указанное вами значение должно находиться в диапазоне от {0} до {1}»
отлично подходит, если {0} и {1} являются числами, такими как 5 и 10. Если вы форматируете в такие строки, как «пять» и «десять», это затруднит локализацию.
Вы можете решить проблему читабельности, о которой вы говорите, просто правильно назвав свои ресурсы.
string someString = string.Format (Properties. Resources.IntegerRangeError, minValue, maxValue);
Оцените, генерируете ли вы видимые для пользователя строки на правильном уровне абстракции в вашем коде. В общем, я стараюсь сгруппировать все видимые пользователю строки в коде, максимально приближенном к пользовательскому интерфейсу. Если какой-либо код ввода-вывода файла низкого уровня должен выдавать ошибки, он должен делать это с исключениями, которые вы обрабатываете в своем приложении, и с последовательными сообщениями об ошибках. Это также объединит все ваши строки, требующие локализации, вместо того, чтобы добавлять их в код.
Чтобы помочь добавить жестко закодированные строки или даже ускорить добавление строк в файл ресурсов, вы можете использовать CodeRush Xpress, который можно бесплатно скачать здесь: http: / /www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/
После того, как вы напишете строку, вы можете получить доступ к меню CodeRush и извлечь его в файл ресурсов за один шаг. Очень хорошо.
Resharper имеет аналогичную функциональность .
Я не понимаю, почему включение строки формата в программу - это плохо. В отличие от традиционных недокументированных магических чисел, с первого взгляда совершенно очевидно, что он делает. Конечно, если вы используете строку формата в нескольких местах, она обязательно должна быть сохранена в соответствующей переменной только для чтения, чтобы избежать избыточности.
Я согласен, что сохранение ее в ресурсах здесь не является необходимым косвенным указанием. Возможное исключение - если вашу программу нужно локализовать, и вы локализуете ее с помощью файлов ресурсов.