Использовать путь. Это имеет преимущество, заключающееся в том, что он работает для API менее 21 (поэтому Arc также ограничен, поэтому I quad). Это проблема, потому что не все имеют Lollipop. Однако вы можете указать RectF и установить значения с ним и использовать arc обратно в API 1, но тогда вы не сможете использовать статический (без объявления нового объекта для сборки объекта).
Рисование закругленного прямоугольника:
path.moveTo(right, top + ry);
path.rQuadTo(0, -ry, -rx, -ry);
path.rLineTo(-(width - (2 * rx)), 0);
path.rQuadTo(-rx, 0, -rx, ry);
path.rLineTo(0, (height - (2 * ry)));
path.rQuadTo(0, ry, rx, ry);
path.rLineTo((width - (2 * rx)), 0);
path.rQuadTo(rx, 0, rx, -ry);
path.rLineTo(0, -(height - (2 * ry)));
path.close();
В качестве полной функции:
static public Path RoundedRect(float left, float top, float right, float bottom, float rx, float ry, boolean conformToOriginalPost) {
Path path = new Path();
if (rx < 0) rx = 0;
if (ry < 0) ry = 0;
float width = right - left;
float height = bottom - top;
if (rx > width/2) rx = width/2;
if (ry > height/2) ry = height/2;
float widthMinusCorners = (width - (2 * rx));
float heightMinusCorners = (height - (2 * ry));
path.moveTo(right, top + ry);
path.rQuadTo(0, -ry, -rx, -ry);//top-right corner
path.rLineTo(-widthMinusCorners, 0);
path.rQuadTo(-rx, 0, -rx, ry); //top-left corner
path.rLineTo(0, heightMinusCorners);
if (conformToOriginalPost) {
path.rLineTo(0, ry);
path.rLineTo(width, 0);
path.rLineTo(0, -ry);
}
else {
path.rQuadTo(0, ry, rx, ry);//bottom-left corner
path.rLineTo(widthMinusCorners, 0);
path.rQuadTo(rx, 0, rx, -ry); //bottom-right corner
}
path.rLineTo(0, -heightMinusCorners);
path.close();//Given close, last lineto can be removed.
return path;
}
Вы хотите полностью привязать эти угловые биты, а не квадраты по ним. Это то, что подходит для соответствия TOOriginalPost. Просто подключитесь к контрольной точке.
Если вы хотите сделать это, но не заботитесь о материалах, предшествующих Lollipop, и настоятельно настаивайте на том, что если ваши rx и ry достаточно высоки, он должен нарисовать круг.
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
static public Path RoundedRect(float left, float top, float right, float bottom, float rx, float ry, boolean conformToOriginalPost) {
Path path = new Path();
if (rx < 0) rx = 0;
if (ry < 0) ry = 0;
float width = right - left;
float height = bottom - top;
if (rx > width/2) rx = width/2;
if (ry > height/2) ry = height/2;
float widthMinusCorners = (width - (2 * rx));
float heightMinusCorners = (height - (2 * ry));
path.moveTo(right, top + ry);
path.arcTo(right - 2*rx, top, right, top + 2*ry, 0, -90, false); //top-right-corner
path.rLineTo(-widthMinusCorners, 0);
path.arcTo(left, top, left + 2*rx, top + 2*ry, 270, -90, false);//top-left corner.
path.rLineTo(0, heightMinusCorners);
if (conformToOriginalPost) {
path.rLineTo(0, ry);
path.rLineTo(width, 0);
path.rLineTo(0, -ry);
}
else {
path.arcTo(left, bottom - 2 * ry, left + 2 * rx, bottom, 180, -90, false); //bottom-left corner
path.rLineTo(widthMinusCorners, 0);
path.arcTo(right - 2 * rx, bottom - 2 * ry, right, bottom, 90, -90, false); //bottom-right corner
}
path.rLineTo(0, -heightMinusCorners);
path.close();//Given close, last lineto can be removed.
return path;
}
Итак, concToOriginalPost на самом деле рисует закругленный прямоугольник без двух нижних битов.
Угловые документы пишут :
. Один из ключей к успешному обновлению - это сделать это постепенно, запустив две рамки бок о бок в одном и том же приложения и портирования угловых компонентов 1 на угловое 2 по одному. Это позволяет модернизировать даже большие и сложные приложения, не нарушая работу другого бизнеса, потому что работа может быть выполнена совместно и распределена в течение определенного периода времени. Модуль обновления в Angular 2 был спроектирован так, чтобы инкрементная модернизация была бесшовной.
blockquote>Когда мы используем UpgradeAdapter, что мы действительно работаем с обеими версиями Angular в одно и то же время. Весь код Angular 2 работает в ракурсе «Угловое 2» и «Угловой код 1» в ракурсе «Угловой 1». Оба эти являются полностью полнофункциональными версиями фреймворков. Эмуляция отсутствует, поэтому мы можем ожидать, что у вас будут все функции и естественное поведение обеих фреймворков.
Что происходит в дополнение к тому, что компоненты и службы, управляемые одной инфраструктурой, могут взаимодействовать с теми из другой рамки. Это происходит в трех основных областях: инъекции зависимостей, DOM и обнаружении изменений.
blockquote>То есть модуль обновления выполняет именно то, что вы хотите.