마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

GridView 에서 스크롤이 버벅거립니다.

0 추천

핸드폰 폴더에 있는 사진을 가져와 그리드뷰에 뿌릴려고 합니다.

현재 그리드뷰에 사진은 뿌려지는데 스크롤이 버벅거리면서 다음 사진으로 넘어가는게 많이 느립니다.

제가 만든 소스에서 추가사항으로 넣어야 하는게 있는지,

아니면 다른 방법으로 적용해야 하는지 감이 잡히지 않아 도움을 요청드려 봅니다.

부족한 점이 많은 초보개발자라 예제 위주로 가르쳐주시면 감사하겠습니다.

 

package com.example.seesaw;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;

public class DataIn extends Activity implements OnClickListener{

	String sessionid;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.datain);
        
        Intent intent1 = getIntent();
        sessionid = intent1.getExtras().getString("sessionid");
        
        GridView gridView = (GridView)findViewById(R.id.gridView1);
        gridView.setAdapter(new ImageAdapter(this));
        
        gridView.setOnItemClickListener(new OnItemClickListener() {
        
        	@Override
        	public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        		Toast.makeText(DataIn.this, ""+position, Toast.LENGTH_SHORT).show();
        	}
		});
    }

	@Override
	public void onClick(View v) {
		
	}
}

 

package com.example.seesaw;

import java.io.File;
import java.io.IOException;
import java.util.Locale;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.view.WindowManager;

	public class ImageAdapter extends BaseAdapter{
		private Context mContext;
		
		String [] filename, filepath;
		
		int k;
		int orientation, rotation;
		
		Bitmap bitmap, rotateBitmap, resizebitmap, cutbitmap;

		ImageView imageView;

 
		 public ImageAdapter(Context c) {
			 mContext = c;
		 }
		 
		 @Override
		 public int getCount() {
			 imagesetting();
			 return k;
		 }
		 
		 @Override
		 public Object getItem(int position) {
			 return null;
		 }
		 
		 @Override
		 public long getItemId(int position) {
			 return 0;
		 }
		 
		 int height, width;
		 
		 @Override
		 public View getView(int position, View convertView, ViewGroup parent) {
			
			 
			height = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight();
			width = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
			 
			if(convertView == null){
				imageView = new ImageView(mContext);
				imageView.setLayoutParams(new GridView.LayoutParams(width*212/720,height*212/1280));
				imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
				imageView.setPadding(8, 8, 8, 8);
			}else{
				imageView = (ImageView)convertView;
			}
		  
			imageView.setBackgroundResource(R.drawable.photo_frame);
			
			imageView.setImageBitmap(bitmapcreate(position));
		  
			return imageView;
		}
		 
		public void imagesetting(){
			filename = null;
			filepath = null;
				
			File f = new File(Environment.getExternalStorageDirectory()+"/DCIM/Camera1/");
			File[] files = f.listFiles();
						
			k = 0;
			filename = new String[files.length];
			filepath = new String[files.length];
				
			for(int i=0;i<files.length;i++){
				File file = files[i];
					
				String curFile = file.getPath();
				String ext = curFile.substring(curFile.lastIndexOf(".")+1,curFile.length()).toLowerCase(Locale.KOREA);
					
				if(ext.equals("jpg") || ext.equals("jpeg") || ext.equals("gif") || ext.equals("png")){
					filename[k] = file.getName();
					filepath[k] = file.getPath();
					k = k + 1;
				}
			}
		}
		
		public Bitmap bitmapcreate(int i){
			bitmap = null;
			rotateBitmap = null;
			resizebitmap = null;
			cutbitmap = null;
			
			BitmapFactory.Options bmOptions = new BitmapFactory.Options();
		    bmOptions.inJustDecodeBounds = true;
		    BitmapFactory.decodeFile(filepath[i], bmOptions);
		    
		    bmOptions.inJustDecodeBounds = false;
	        
		    if (bmOptions.outWidth > 1600) {
		    	bmOptions.inSampleSize = 8;
		    } else {
		     	bmOptions.inSampleSize = 2;
		    }
		        
		    bmOptions.inPurgeable = true;
	     
		    bitmap = BitmapFactory.decodeFile(filepath[i], bmOptions);		
		    
		    try {
		    	ExifInterface mExif = new ExifInterface(filepath[i]);
	       		orientation = Integer.parseInt(mExif.getAttribute(ExifInterface.TAG_ORIENTATION));

			} catch (IOException e){
			   	Log.i("IOException e :",""+e);
			  	e.printStackTrace();
			} catch (Exception e){
			   	Log.i("Exception e :",""+e);
			}	
	        
	        if (orientation == 6){
	        	rotation = 90;
	        } else if (orientation == 8){
	        	rotation = 270;
	        } else if (orientation == 3){
	        	rotation = 180;
	        } else if ((orientation == 1) || (orientation == 0)){
	        	rotation = 0;
	        }
	        
	        Matrix matrix = new Matrix();
		    matrix.postRotate(rotation);
		    
		    rotateBitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
		    
		    if(bitmap.getWidth() > bitmap.getHeight()){			// 기본 가로가 긴 사진
		    	if(rotation == 0 || rotation == 180){			// 회전값이 0 또는 180 인 사진 (가로)
		    		resizebitmap = Bitmap.createScaledBitmap(rotateBitmap, (int)((212*rotateBitmap.getWidth()/rotateBitmap.getHeight())*width/720), (int)(212*height/1280), true);
		        	cutbitmap = Bitmap.createBitmap(resizebitmap, ((resizebitmap.getWidth()-resizebitmap.getHeight())/2), 0, (int)(212*width/720), (int)(212*height/1280));
		    	} else if(rotation == 90 || rotation == 270){	// 회전값이 90 또는 270인 사진 (세로가 누운 사진)
		        	resizebitmap = Bitmap.createScaledBitmap(rotateBitmap, (int)(212*width/720), (int)((212*rotateBitmap.getHeight()/rotateBitmap.getWidth())*height/1280), true);
		        	cutbitmap = Bitmap.createBitmap(resizebitmap, 0, ((resizebitmap.getHeight()-resizebitmap.getWidth())/2), (int)(212*width/720), (int)(212*height/1280));
		        }
		    } else if(bitmap.getWidth() < bitmap.getHeight()){  // 기본 세로가 긴 사진
		       	if(rotation == 0 || rotation == 180){
		       		resizebitmap = Bitmap.createScaledBitmap(rotateBitmap, (int)(212*width/720), (int)((212*rotateBitmap.getHeight()/rotateBitmap.getWidth())*height/1280), true);
		       		cutbitmap = Bitmap.createBitmap(resizebitmap, 0,((resizebitmap.getHeight()-resizebitmap.getWidth())/2), (int)(212*width/720), (int)(212*height/1280));
		       	} else if(rotation == 90 || rotation == 270){
		       		
		       	}
		    } else if(bitmap.getWidth() == bitmap.getHeight()){ // 기본 정사각형 사진
		       	if(rotation == 0 || rotation == 180){
		       		resizebitmap = Bitmap.createScaledBitmap(rotateBitmap, (int)(212*width/720), (int)(212*height/1280), true);
		       		cutbitmap = Bitmap.createBitmap(resizebitmap, 0, 0, (int)(212*width/720), (int)(212*height/1280));
		       	} else if(rotation == 90 || rotation == 270){
		       		
		       	}
		    }

	        bitmap = cutbitmap;
	        
			return bitmap;
		}

}

 

다크실프 (180 포인트) 님이 2014년 12월 5일 질문

2개의 답변

0 추천
사진 회전 시키고 리사이징 시키는 작업을 따로 스레드를 돌리셔야 할꺼같네요
mamondebaltob (32,750 포인트) 님이 2014년 12월 5일 답변
답변 감사합니다.
그렇다면 그 부분을 비동기로 따로 쓰레드를 구현하면 되는건가요?
맞게 이해했는지 잘 몰라서요.
0 추천
윗분 답변에 추가로...

사진이 많다면 현재 화면에 보여지는 그리드의 셀 갯수만큼만 사진을 불러와서 뿌려주는 것을 구현하셔야 안느릴겁니다.

구현이 잘 되었다면 사용자가 스크롤을 빠르게 올리면 아래에 숨어있던 나머지 셀들은 사진 없이 비어있다가

뒤늦게 로딩이 되는식으로 구현이 되겠죠.
익명사용자 님이 2014년 12월 6일 답변
답변 감사합니다.
그러면 예를 들어, 10개의 사진씩 가져온다 치면 전체갯수/10 하여 그만큼 반복문을 돌리고, 1번 실행될때는 10개씩만 보여주는 식을 말씀하시는게 맞는지요?
...