Comments 9
Это не статья, а листинг с комментариями.
0
Обратите внимание, что это «из песочницы». Зачем сразу давить человека негативными коментарием, это же его первая статья на хабре. После похожих коментариев желание писать другую статью напрочь отпадает, из-за опасения получать похожие коментарии. Можно было бы и более снисходительно.
Автору: молодец, есть некоторые косяки в реализации (см. комментарий ниже), но в целом неплохо как для начала!
Автору: молодец, есть некоторые косяки в реализации (см. комментарий ниже), но в целом неплохо как для начала!
0
это же его первая статья на хабре
Это отлично, что сюда еще кто-то пишет, но раз написал, то будь готов воспринимать объективную критику. Это реально код с комментариями, за ним я могу сходить на гитхаб.
желание писать другую статью напрочь отпадает, из-за опасения получать похожие коментарии
Если и следующая статья будет такой, то не страшно, если автор ее не напишет :) Для себя такие велосипеды писать можно и нужно, а на хабре хочется интересных и полезных статей, которых последнее время и так мало.
Да и вообще взрослого человека мало должны волновать комментарии в этих ваших интернетах. Будет, что сказать, — напишет, не переживайте.
+1
Неплохо бы onMeasure() поправить, чтобы избежать
вот таких вещей
+1
Такое интересно самому писать, а не читать. Или уж просто юзать не вдаваясь в подробности. Кстати, делал похожее под iOS, кому интересно: https://github.com/DnV1eX/DNVAvatar
pavel_dolbik, а почему у вас в статье и на гитхабе все картинки сплющены?
pavel_dolbik, а почему у вас в статье и на гитхабе все картинки сплющены?
0
Чем лучше делать кастомную отрисовку, чем просто наложить поверх еще один ImageView с рамкой?
0
позволю себе предложить еще пару улучшений, кроме уже озвученного переопределить onMeasure():
1) canvas.drawBitmap(finalBitmap, rect, rect, imgPaint); rect здесь не имеет никакого смысла. потому что суть метода в том, чтобы эти src и dst прямоугольники были разные, чтобы при отрисовки применился скейл и сдвиг. можно было написать чуть проще canvas.drawBitmap(finalBitmap, 0, 0, imgPaint), где 0 это верхняя и левая позиция для отрисовки. или же можно было использовать этот rect для скейла исходной картинки и обойтись без шага Bitmap finalBitmap = bitmap.createScaledBitmap(bitmap, radius, radius, false); и необходимости создавать промежуточный Bitmap (кстати, у вас параметр метода называется radius, хотя используете вы его как диаметр):
2) в onTouchEvent следует еще реагировать на MotionEvent.ACTION_CANCEL — он вызовется когда юзер нажмет пальцем в области вашей View, но потом уведет палец куда то в сторону, то есть фактически ACTION_UP будет выполнен потом уже не в области вашей View. На этот event не стоит реагировать как на tap, то есть отмечать картинку как выделенную, но стоит выполнить обратную scale анимацию, иначе вьюшка так и останется уменьшенной.
1) canvas.drawBitmap(finalBitmap, rect, rect, imgPaint); rect здесь не имеет никакого смысла. потому что суть метода в том, чтобы эти src и dst прямоугольники были разные, чтобы при отрисовки применился скейл и сдвиг. можно было написать чуть проще canvas.drawBitmap(finalBitmap, 0, 0, imgPaint), где 0 это верхняя и левая позиция для отрисовки. или же можно было использовать этот rect для скейла исходной картинки и обойтись без шага Bitmap finalBitmap = bitmap.createScaledBitmap(bitmap, radius, radius, false); и необходимости создавать промежуточный Bitmap (кстати, у вас параметр метода называется radius, хотя используете вы его как диаметр):
private Bitmap getRoundedCroppedBitmap(Bitmap bitmap, int size) {
Bitmap output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Rect rect = new Rect(0, 0, size, size);
Canvas canvas = new Canvas(output);
canvas.drawCircle(
size / 2,
size / 2,
size / 2,
imgPaint);
imgPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(finalBitmap, null, rect, imgPaint);
return output;
}
2) в onTouchEvent следует еще реагировать на MotionEvent.ACTION_CANCEL — он вызовется когда юзер нажмет пальцем в области вашей View, но потом уведет палец куда то в сторону, то есть фактически ACTION_UP будет выполнен потом уже не в области вашей View. На этот event не стоит реагировать как на tap, то есть отмечать картинку как выделенную, но стоит выполнить обратную scale анимацию, иначе вьюшка так и останется уменьшенной.
0
Sign up to leave a comment.
Custom rounded view