Android 사용자 정의 구성 요소 로 컬 그림 과 카메라 사진 가 져 오기

iOS 에서 포 장 된 그림 을 선택 한 후 길 게 누 르 면 애니메이션 삭제 효과 가 나타 납 니 다.효 과 는 다음 과 같 습 니 다. 
这里写图片描述  
안 드 로 이 드 는 오랫동안 이런 효과 가 있 는 제3자 구성 요 소 를 찾 지 못 했 습 니 다.결국 찾기 가 귀 찮 으 니 스스로 이 효 과 를 실현 하 는 것 이 좋 겠 습 니 다.
그림 을 선택 하면 그림 을 편집 할 수 있 습 니 다. 
这里写图片描述
물론 코드 에 완선 되 지 않 은 부분 이 많 습 니 다.저 는 다음 에 이 구성 요 소 를 계속 보완 하 겠 습 니 다.
오픈 소스 커 뮤 니 티 에 올 라 왔 습 니 다.스타 에 오신 걸 환영 합 니 다.
데모 소스 코드:전송 문
디자인 에서 부 딪 힌 문제 와 해결 사고
1.어떻게 플러스 그림 을 GridView 맨 뒤에 표시 합 니까?
우선 GridAdapter 구조 방법 을 호출 할 때 추가 그림 을 불 러 옵 니 다.

 /**
 *      
 * @param context    
 * @param imagesum         
 */
 public GridAdapter(Context context, int imagesum) {
 this.context = context;
 this.imageSum = imagesum;
 //     
 mAddBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_add_image);
 }
그리고 getCount()방법 에 그림 데이터 집합 에 1 을 추가 하고 이 위치 에 플러스 그림 을 추가 합 니 다.

 @Override
 public int getCount() {
 //       ,         
 return imageItemData == null ? 0 : imageItemData.size() + 1;
 }
마지막 으로 getView()방법 에서 그림 을 표시 할 때마다 데이터 집합 중의 요소 수량 을 판단 하고 데이터 집합 수량 이 position 보다 많 으 면 플러스 그림 을 표시 해 야 한 다 는 것 을 나타 낸다.

 if (imageItemData != null && imageItemData.size() > position) {
 //     
 } else {
 //     
 }
이렇게 하면 플러스 이미지 가 GridView 마지막 item 에 계속 있 음 을 보증 할 수 있 습 니 다.
2.삭제 단 추 를 표시 하 는 방법
item 레이아웃 에서 그림 의 오른쪽 상단 에 삭제 단 추 를 덮어 쓰 고 Adapter 에서 이 그림 의 표시 와 숨 김 을 처리 합 니 다.

/**            true=   */
 private boolean showImageClear = false;
 //            
 /**
 *         
 * @param clear     
 */
 public void setClearImgShow(boolean clear) {
 showImageClear = clear;
 }

 /**
 *       
 * @return    true=  
 */
 public boolean getClearImgShow() {
 return showImageClear;
 }

삭제 단 추 는 기본적으로 표시 되 지 않 습 니 다.사용자 가 그림 을 길 게 누 르 면 표 시 됩 니 다.

//         
mGridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
 @Override
 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
 if (!(position == gridAdapter.imageItemData.size())) {
 //                 
 if (!gridAdapter.getClearImgShow()) {
 gridAdapter.setClearImgShow(true);
 gridAdapter.notifyDataSetChanged();
 }
 }
 //   true,        
 return true;
 }
});
클릭 이벤트 의 길 이 를 차단 하고 반환 값 을 true 로 설정 해 야 합 니 다.클릭 이벤트 의 감청 도 설정 되 어 있 기 때문에 이 벤트 를 차단 하지 않 으 면 이벤트 가 끝 난 후에 클릭 이 벤트 를 동시에 실행 합 니 다.
마지막 으로 중요 한 것 은 GridAdapter 클래스 의 getView 방법 에서 제어 합 니 다.getClearImgShow 방법 으로 그림 을 삭제 할 때 표시 할 지 여 부 를 가 져 옵 니 다.true 로 돌아 가면 표시 되 고 애니메이션 인 스 턴 스 를 가 져 와 그림 이 애니메이션 효 과 를 실행 하도록 합 니 다.

 if (imageItemData != null && imageItemData.size() > position) {
 //     
 //              , true   ,       
 if (getClearImgShow()) {
 holder.imgclear.setVisibility(View.VISIBLE);
 CustomRotateAnim anim = CustomRotateAnim.getCustomRotateAnim();
 anim.setDuration(300);
 anim.setRepeatCount(2);
 anim.setInterpolator(new LinearInterpolator()); //      
 holder.img.startAnimation(anim);
 } else {
 //     ,      
 holder.img.clearAnimation();
 holder.imgclear.setVisibility(View.GONE);
 }
 holder.img.setImageBitmap(PhotoBitmapUtil.getCompressPhoto(imageItemData.get(position)));
 } else {
 ......  ......
 }
3.그림 이 최대 수 에 이 르 렀 을 때 추가 단 추 를 숨 기 는 방법
GridAdapter 를 사용 할 때 호출 자 는 최대 그림 수 를 입력 해 야 합 니 다.

gridAdapter = new GridAdapter(MainActivity.this, 8);
mGridView.setAdapter(gridAdapter);
그리고 GridAdapter 에서 이 최대 그림 수 를 받 고 getView()방법 에서 플러스 그림 의 표 시 를 관리 합 니 다.

 if (imageItemData != null && imageItemData.size() > position) {
 //        
 ......  ......
 } else {
 //       
 //                 
 if (imageItemData.size() != imageSum) {
 holder.imgclear.setVisibility(View.GONE); //        
 holder.img.clearAnimation(); //     
 holder.img.setImageBitmap(mAddBitmap);
 }
 }
"gridAdapter.getCount()-1"은 우리 가 플러스 그림 을 추가 할 때 1 을 추 가 했 기 때문에 사용 할 때 1 을 줄 여야 합 니 다.

 //     
 mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 //                ,    
 if (gridAdapter.getClearImgShow()) {
  gridAdapter.setClearImgShow(false);
  gridAdapter.notifyDataSetChanged();
 } else {
  if (gridAdapter.getCount() - 1 == position) {
  //                
  if (!(gridAdapter.imageItemData.size() == gridAdapter.imageSum)) {
  selectPhoto.showPopupSelect(mGridView);
  }
  } else {
  popupViewGridPhoto(position);
  }
 }

 }
 });

4.그림 을 불 러 올 때 메모리 소모량 을 줄 이 는 방법
GridView 에 그렇게 많은 그림 을 표시 하려 면 여러 그림 을 압축 처리 해 야 합 니 다.그렇지 않 으 면 OOM 오류 가 발생 하기 쉽 습 니 다.
여기 서 품질 압축 을 통 해 그림 을 불 러 오 는 메모리 크기 를 낮 춥 니 다.

 /**
 *     1/5     
 *
 * @param path      
 * @return       
 */
 public static Bitmap getCompressPhoto(String path) {
 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inJustDecodeBounds = false;
 options.inSampleSize = 5; //                
 Bitmap bmp = BitmapFactory.decodeFile(path, options);
 options = null;
 return bmp;
 }

다른 방식 으로 도 이 블 로 그 를 참고 할 수 있 습 니 다<Android 메모리 넘 침 방지(Out of Memory)방법 요약>
5.일부 휴대 전화 가 사진 을 찍 은 후 사진 이 회전 하 는 문 제 를 어떻게 방지 합 니까?
테스트 에서 일부 삼 성 휴대 전 화 는 사진 을 촬영 한 후 90 도 회전 시 켰 다.이 디자인 은 정말 구덩이 이다.이 를 위해 서 는 이 문 제 를 처리 해 야 한다.사진 을 찍 을 때마다 그림 의 회전 각 도 를 얻어 야 한다.그림 이 회전 되면 다시 돌려 야 한다.
이 블 로 그 를 참고 할 수 있 습 니 다.
&lt;안 드 로 이 드,일부 휴대 전화 사진 촬영 후 획득 한 사진 회전 문제 해결&gt;
6.그림 을 좌우 로 흔 드 는 방법
그림 이 좌우 로 흔 들 리 는 효 과 를 실현 하려 면 애니메이션 을 사용자 정의 해 야 합 니 다.
이 블 로그 참조 가능
'안 드 로 이 드 사용자 정의 애니메이션,보기 흔 들 림 효과 구현'
여기 먼저 이렇게 많은 것 을 소개 하 겠 습 니 다.상세 한 해석 코드 주석 에 모두 있 으 니 더 이상 말 하지 않 겠 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기