Опоры к Джорджу Уолтерсу II выше, я только что взял его ответ и немного расширил его, чтобы поддерживать округление отдельных углов по-разному.
Я знаю, что эта ветка немного устарела, но ее один из лучших результатов для запросов в Google для как круглые углы ImageViews на Android.
/**
* Use this method to scale a bitmap and give it specific rounded corners.
* @param context Context object used to ascertain display density.
* @param bitmap The original bitmap that will be scaled and have rounded corners applied to it.
* @param upperLeft Corner radius for upper left.
* @param upperRight Corner radius for upper right.
* @param lowerRight Corner radius for lower right.
* @param lowerLeft Corner radius for lower left.
* @param endWidth Width to which to scale original bitmap.
* @param endHeight Height to which to scale original bitmap.
* @return Scaled bitmap with rounded corners.
*/
public static Bitmap getRoundedCornerBitmap(Context context, Bitmap bitmap, float upperLeft,
float upperRight, float lowerRight, float lowerLeft, int endWidth,
int endHeight) {
float densityMultiplier = context.getResources().getDisplayMetrics().density;
// scale incoming bitmap to appropriate px size given arguments and display dpi
bitmap = Bitmap.createScaledBitmap(bitmap,
Math.round(endWidth * densityMultiplier),
Math.round(endHeight * densityMultiplier), true);
// create empty bitmap for drawing
Bitmap output = Bitmap.createBitmap(
Math.round(endWidth * densityMultiplier),
Math.round(endHeight * densityMultiplier), Config.ARGB_8888);
// get canvas for empty bitmap
Canvas canvas = new Canvas(output);
int width = canvas.getWidth();
int height = canvas.getHeight();
// scale the rounded corners appropriately given dpi
upperLeft *= densityMultiplier;
upperRight *= densityMultiplier;
lowerRight *= densityMultiplier;
lowerLeft *= densityMultiplier;
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
// fill the canvas with transparency
canvas.drawARGB(0, 0, 0, 0);
// draw the rounded corners around the image rect. clockwise, starting in upper left.
canvas.drawCircle(upperLeft, upperLeft, upperLeft, paint);
canvas.drawCircle(width - upperRight, upperRight, upperRight, paint);
canvas.drawCircle(width - lowerRight, height - lowerRight, lowerRight, paint);
canvas.drawCircle(lowerLeft, height - lowerLeft, lowerLeft, paint);
// fill in all the gaps between circles. clockwise, starting at top.
RectF rectT = new RectF(upperLeft, 0, width - upperRight, height / 2);
RectF rectR = new RectF(width / 2, upperRight, width, height - lowerRight);
RectF rectB = new RectF(lowerLeft, height / 2, width - lowerRight, height);
RectF rectL = new RectF(0, upperLeft, width / 2, height - lowerLeft);
canvas.drawRect(rectT, paint);
canvas.drawRect(rectR, paint);
canvas.drawRect(rectB, paint);
canvas.drawRect(rectL, paint);
// set up the rect for the image
Rect imageRect = new Rect(0, 0, width, height);
// set up paint object such that it only paints on Color.WHITE
paint.setXfermode(new AvoidXfermode(Color.WHITE, 255, AvoidXfermode.Mode.TARGET));
// draw resized bitmap onto imageRect in canvas, using paint as configured above
canvas.drawBitmap(bitmap, imageRect, imageRect, paint);
return output;
}
Я полагаю, что можно попросить, чтобы AR загрузил определенные столбцы в вызове для нахождения:
MyModel.find(id, :select => 'every, attribute, except, the, blobs')
Однако это должно было бы быть обновлено, поскольку Вы добавляете столбцы, таким образом, это не идеально. Я не думаю, что существует любой способ конкретно исключить один столбец в направляющих (ни в единственном выборе SQL).
Я предполагаю, что Вы могли записать это как это:
MyModel.find(id, :select => (MyModel.column_names - ['column_to_exclude']).join(', '))
Проверьте их перед Вами честное слово все же.:)
Ответ fd в основном правильный, но ActiveRecord в настоящее время не принимает массив в качестве аргумента: select, поэтому вам нужно объединить нужные столбцы в запятую. -delimited строка, например:
desired_columns = (MyModel.column_names - ['column_to_exclude']).join(', ')
MyModel.find(id, :select => desired_columns)
Чистый подход, НЕ ТРЕБУЮЩИЙ ИЗМЕНЕНИЙ в способе кодирования в другом месте приложения, т. Е. Без возни с : выберите
параметры
По любой причине, которая вам нужна для хранения больших двоичных объектов в базах данных. Тем не менее, вы не хотите смешивать столбцы BLOB-объектов в той же таблице, что и ваша обычные атрибуты. BinaryColumnTable помогает хранить ВСЕ капли в отдельная таблица, прозрачно управляемая моделью ActiveRecord. При желании он помогает записывать тип содержимого большого двоичного объекта.
Простое использование
Member.create(:name => "Michael", :photo => IO.read("avatar.png"))
#=> creates a record in "members" table, saving "Michael" into the "name" column
#=> creates a record in "binary_columns" table, saving "avatar.png" binary into "content" column
m = Member.last #=> only columns in "members" table is fetched (no blobs)
m.name #=> "Michael"
m.photo #=> binary content of the "avatar.png" file
Я только что столкнулся с этим, используя направляющую 3.
К счастью, это было не так сложно решить. Я установил default_scope
, который удалял те столбцы, которые мне не нужны, из результата. Например, в моей модели было текстовое поле xml, которое могло быть довольно длинным и не использовалось в большинстве представлений.
default_scope select((column_names - ['data']).map { |column_name| "`#{table_name}`.`#{column_name}`"})
Из решения вы увидите, что мне пришлось сопоставить столбцы с полностью квалифицированными версиями, чтобы я мог продолжать использовать модель через отношения без двусмысленности в атрибутах. Позже, когда вы захотите, чтобы поле было просто прикреплено к другому .select (: data)
, чтобы оно было включено.