getView가 호출 될때 메인스레드에서 요청하는건 아니고 따로 스레드를 돌려서
웹에서 이미지를 받아서 setImage 해주는 방식으로 구현하였습니다...
첫번째 문제는....스크롤이 너무 민감하여 한장만 넘기려면 스크롤 해서
정확히 다음 사진이 50% 이상까지 넘어왔을때 손을 떼면 자동으로 다음 이미지의 중점으로 포커스가
맞춰지면서 흡사 사진첩같이 작동을 하는데요 스크롤시 조금만 빨리 손을 떼거나 아예 세개 했을 경우
가속도가 엄청나게 붙어서 뒤로 슈슈슈슈슈슉 넘어가 버립니다...
이 민감도를 조절할 수 있을까요? 아니면 아예 가속도에 상관없이 한 장씩 넘어가게 해준다거나요...
그리고 두번째 문제는 첫번째 문제에서 여러장을 한번에 넘길때 발생하는데
아무래도 getView시에 웹으로 이미지를 요청 하기 때문에 이미지가 사진첩처럼 쭈루룩
붙어있는 느낌이 아니고 하나씩 탁탁 붙는 느낌입니다...
예를 들어 총 개수가 10개라면 10개가 붙어있는게 아니라 새로운 사진이 getView 될 때마다
사진이 한장씩 요청한 후에 탁 탁탁 붙는 느낌이라 뭔가 자연스럽지 못해서 좀 퍼포먼스가 떨어집니다...
두번째 문제는 이미지를 getView시에 요청하지 않고 이전의 전체 이미지 리스트의 썸네일을 먼저 보여주고
getView시에 기존의 방식대로 요청하여 고해상도 이미지로 교체하는 식으로 해도 될것 같고....
첫번째 문제 해결책중에 한페이지씩만 넘기게 만들면 괜찮을거 같긴 합니다...
갤러리가 이전이미지와 다음 이미지가 약 5~10픽셀 정도씩 겹쳐있으면서 포커스받은 이미지가 위로
올라오게끔 구현이 되어있어서 예를들어 인덱스가 2일때는 getView가 인덱스 1~3이 요청 되더라구여
그래서 한장씩 넘기게 하면 뚝뚝 끊기는 느낌은 덜할것 같은데 이것도 사용자가 여러번 연속적으로
넘기려고 하면 마찬가지가 될것 같구요...
아이폰의 경우 스크롤뷰에 한번에 한 페이지씩만 이동하게끔 하는 옵션이 있어서 그렇게 구현할 경우
괜찮게 작동 하더라구요....레퍼런스를 찾아봤는데도..마땅한 함수가 보이지 않네요...ㅠ
안녕하세요 안드로이드를 공부하고 있는 초보 개발자 입니다.
저도 이문제 때문에 고민을 많이 하고 있는데..쉽지가 않네요..
죄송하지만 프로젝트를 메일로 부탁드려도 될까요..ㅜㅜ
82bye@hanmail.net
하든 하신다음에 갤러리 객체를 생성하실때 Gallery gallery; 로 하시지 마시구 위에 구현한 MyGallery로 생성하시면 되요
아래와 같이..
MyGallery gallery = (MyGallery) findViewById(R.id.gallery);
이렇게 하셔서 하시면 저 위의 벨로씨티X 값을 조작해서 속도 조절이 가능할것 같습니다....
세로로 스크롤 할땐 Y값으로 하시면 되고....
아..감사합니다. 그런데요 장승제님께서 말씀해주신 것처럼 갤러리 객체를 생성하는 부분에서 ClassCastException이 발생하더라구요..
검색을 해보았는데 manifast쪽의 패키지명과 xml쪽의 id값이 일치하는지 모두 확인했는데요..객체 생성이 이루어 지지 않네요..ㅜㅜ
-onCreate
MyGallery gallery = (MyGallery) findViewById(R.id.galleryTop);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
}
});
gallery.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
-class
MyGallery는 승제님껏과 동일하게 작성하였습니다..
캐스팅을 잘못하고 있는것 같은데..조언부탁드립니다..ㅜㅜ
그냥 Gallery로 놓으면 당연히 MyGallery로 형변환 될리가 없습니다.
아..그렇군요!! xml의 겔러리를 아래와 같이 수정하였습니다.
<MyGallery android:id="@+id/galleryTop" android:layout_width="fill_parent" android:layout_height="wrap_content"></MyGallery>
위와 같이 하면 ClassNotFind에러가 잡히는데요, MyGallery라는것은 제가 만든거라서..시스템에 알려줘야 할 것 같습니다..
메니페스트에 따로 추가 해야 하나요..?




한번에 한 페이지씩 움직이는 방법은 찾았습니다.
onFling 함수를 오버라이딩 하면 속도를 조절할 수 있네요...
public class MyGallery extends Gallery{
public MyGallery(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
velocityX *= 0.35;
return super.onFling(e1, e2, velocityX, velocityY);
}
}
위에서 velocityX가 가로 가속도 인데요...이걸 매번 0으로 세팅할 시 손떼면 멈추길래 적당히 줄여서 셋팅하는 식으로 바꿔봤습니다..
생성자는 반드시 컨텍스트와 어트리뷰트를 파라미터로 받는 생성자를 선언 해주셔야 findViewById(int ID);을 통해 객체를 생성할
수 있습니다..