Android 사용자 정의 View 원형 이미지 그리 기 기능

머리말
앱 애플 리 케 이 션 개발 을 할 때 사용자 프로필 사진 은 반드시 없어 서 는 안 되 지만 90%이상 의 수요 프로필 사진 은 모두 원형 이다.그렇다면 어떻게 사용자 정의 View 를 통 해 원형 두상 을 실현 할 수 있 을 까?그러면 이 박문 은 실현 과정 만 이 아니 라 는 것 을 알려 줄 것 이다.생각 지도 못 한 수확 이 있 을 거 야!
최종 효과
국제 관례,우 리 는 먼저 최종 실현 의 효과 도 를 살 펴 보 자.

사용자 정의 RoundImageView 계승  

public class RoundImageView extends ImageView {
  public RoundImageView(Context context) {
    super(context);
  }
  public RoundImageView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
  }
  public RoundImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }
}
 우리 가 View 를 계승 할 때마다 시스템 은 우리 에 게 4 개의 구조 방법 을 덮어 쓰 라 고 알려 준 적 이 있 는 지 모 르 겠 습 니 다.여기 서 우 리 는 세 개 만 덮어 쓰 고 모든 구조 방법 에서 초기 화 를 시작 합 니 다.그러면 매번 모든 구조 방법 을 사용 하지 않 습 니까?그렇지 않 으 면 이 세 가지 구조 방법 은 언제 호출 됩 니까?다음은 예 를 통 해 검증 하 겠 습 니 다.
사용자 정의 View 를 사용 하 는 것 은 두 가지 상황 에서 첫 번 째 는 xml 레이아웃 에서 직접 사용 하 는 것 이 고 다른 하 나 는 Activity 에서 new 가 나 오 는 것 입 니 다.다음은 상기 두 가지 방식 을 사용 하여 우리 가 세 가지 구조 방법 에 각각 한 줄 의 인쇄 를 추가 하 는 것 을 관찰 할 수 있 도록 합 니 다.

우선 xml 에서 직접 사용 합 니 다.인쇄 는 다음 과 같 습 니 다.

com.example.roundimageview D/RoundImageView: RoundImageView:          
그리고 저 희 는 Activity 에서 new Round ImageView.

roundImageView = RoundImageView(this@MainActivity)
roundImageView = RoundImageView(this@MainActivity, null)
roundImageView = RoundImageView(this@MainActivity, null,0)
인쇄 로 그 를 다음 과 같이 실행 합 니 다:

결론:사용자 정의 View 는 xml 에서 사용 할 때 두 번 째 구조 방법 을 사용 합 니 다.Activity 에서 사용 할 때 실례 화 할 때 몇 개의 매개 변 수 를 호출 하 는 것 은 몇 개의 매개 변 수 를 포함 하 는 구조 방법 입 니 다.
원형 두상 의 사상 을 실현 하 다
저 는 항상 사용자 정의 View 의 난이 도 는 그 실현 사상 에 있다 고 생각 합 니 다.보통 우리 가 문 제 를 만 났 을 때 구 글 이 안 되 는 것 이 아니 라 이 문제 가 어떻게 구 글 에 가 야 할 지 전혀 모 릅 니 다.문제 가 발생 하 는 원인 을 알 게 되면 문 제 는 이미 해결 되 었 습 니 다.가장 두 려 운 것 은 문제 가 왜 발생 했 는 지 모 르 는 것 입 니 다.
원형 두상 을 실현 하 는 사상 은 간단 한 그림 으로 표시 할 수 있다.

직사각형 구역 은 완전한 그림 입 니 다.원형 구역 은 우리 가 최종 적 으로 보 여 준 두상 구역 입 니 다.그러면 간단 합 니 다.원형 구역 과 사각형 구역 이 교차 하여 집합 구역 을 취 합 합 합 니까?직사각형 에 직사각형 의 길이 나 너비 와 접 하 는 원 을 그 리 며,원 의 지름 은 길이 나 너비 가 비교적 짧 은 쪽 이다.
인 코딩 구현
기 존 프로필 사진 가 져 오기 bitmap
    우선 프로필 사진 을 설정 한 bitmap 를 가 져 와 야 합 니 다.API 를 통 해 설 정 된 이미지 자원 을 직접 가 져 올 수 있 습 니 다.

drawable = this.getDrawable();
  그림 자원 을 bitmap 로 변환 합 니 다.
  우선 drawable 이 비어 있 는 지 여 부 를 판단 합 니 다.비어 있 는 것 은 사용자 가 설정 하지 않 았 다 는 것 을 설명 하고 자원 이 찾 지 못 한 이상 을 던 집 니 다.

if (drawable == null) {
  throw new Resources.NotFoundException("Image resource not set");
}
  비어 있 지 않 으 면 그림 자원 크기 와 같은 비트 맵 을 만 들 고 비트 맵 을 그립 니 다.코드 는 다음 과 같 습 니 다.

bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
    Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
    drawable.getIntrinsicHeight());
drawable.draw(canvas);
원형 비트 맵 그리 기
     위의 코드 를 통 해 우 리 는 기 존의 bitmap 그림 을 얻 었 습 니 다.이 어 우 리 는 원형 bitmap 를 그 려 야 합 니 다.위 와 유사 합 니 다.먼저 bitmap 크기 와 일치 하 는 비트 맵 을 만 듭 니 다.

circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
우 리 는 bitmap 등 큰 사각형 을 그 렸 다.

Paint paint = new Paint();
Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
canvas.drawRect(rect,paint);
RectF rectF = new RectF(rect);
  비교적 짧 은 쪽 을 원 의 반지름 으로 설정 하 다.

float roundRa = 0.0f;
if (bitmap.getWidth() > bitmap.getHeight()) {
  roundRa = bitmap.getHeight() / 2.0f;
} else {
  roundRa = bitmap.getWidth() / 2.0f;
}
   paint 와 canvas 속성 설정

paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.WHITE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawARGB 는 커팅 을 투명 하 게 설정 합 니 다.
마지막 으로 비트 맵 을 다시 그리 면 됩 니 다.

canvas.drawBitmap(bitmap, rect, rect, paint);
부분 전체 코드 를 다음 과 같이 그립 니 다.
 

*        bitmap
 *
 * @param bitmap  bitmap
 */
private Bitmap getCircleBitmap(Bitmap bitmap) {
  circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(circleBitmap);
  Paint paint = new Paint();
  Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
  RectF rectF = new RectF(rect);
  float roundRa = 0.0f;
  if (bitmap.getWidth() > bitmap.getHeight()) {
    roundRa = bitmap.getHeight() / 2.0f;
  } else {
    roundRa = bitmap.getWidth() / 2.0f;
  }
  paint.setAntiAlias(true);
  canvas.drawARGB(0, 0, 0, 0);
  paint.setColor(Color.GRAY);
  canvas.drawRoundRect(rectF, roundRa, roundRa, paint);
  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
  canvas.drawBitmap(bitmap, rect, rect, paint);
  return circleBitmap;
}
최종 비트 맵 설정
    bitma 를 받 으 면 바로 다시 설정 하면 표시 합 니 다.

 setImageBitmap(getCircleBitmap(bitmap));
   이 인 스 턴 스 는 비교적 간단 합 니 다.모든 코드 를 붙 이지 않 습 니 다.메 일 박스 가 필요 하 다 면 오류 가 있 으 면 지적 해 주 십시오!안녕 히 주 무 세 요.
   9.15 22:17 업데이트
   코드 업로드 github:https://github.com/huanglinqing123/RoundImageView 
총결산
위 와 같이 소 편 이 소개 한 안 드 로 이 드 사용자 정의 뷰 의 원형 이미지 그리 기 기능 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기