Android 그림 을 반복 적 으로 표시 할 수 있 는 Android Gallery 구성 요소 사용법 인 스 턴 스
Gallery 구성 요 소 는 그림 목록 을 가로로 표시 하 는 데 사용 되 지만 일반적인 방법 으로 는 사용 합 니 다.Gallery 구성 요 소 는 지정 한 그림 만 제한 적 으로 표시 할 수 있 습 니 다.갤러리 구성 요소 에 10 장의 그림 을 지정 하면 갤러리 구성 요소 가 10 장 까지 표 시 될 때 더 이상 표시 되 지 않 는 다 는 것 이다.이것 은 대부분의 경우 아무런 관계 가 없 지만,어떤 경우 에는 그림 이 마지막 장 에 표 시 될 때 첫 번 째 장 을 다시 시작 하 기 를 바 랍 니 다.즉,순환 표시 입 니 다.이러한 스타일 의 Gallery 구성 요 소 를 실현 하려 면 Gallery 의 Adapter 대상 을 개선 해 야 합 니 다.
Gallery 구성 요소 의 전통 적 인 용법
그림 을 순환 적 으로 표시 할 수 있 는 Gallery 구성 요 소 를 실현 하기 전에 Gallery 구성 요소 의 전통 적 인 용법 을 살 펴 보 세 요.Gallery 구성 요 소 는 그림 목록 을 가로로 표시 할 수 있 습 니 다.현재 그림 의 다음 그림 을 누 르 면 이 그림 목록 은 왼쪽으로 한 칸 이동 합 니 다.현재 그림 의 이전 그림 을 누 르 면 이 그림 목록 은 오른쪽으로 이동 합 니 다.그림 목록 을 왼쪽 과 오른쪽으로 드래그 해서 이동 할 수도 있 습 니 다.현재 표 시 된 것 은 첫 번 째 그림 의 효과 입 니 다.그림 1 참조.Gallery 구성 요소 가 마지막 그림 에 나타 나 는 효 과 는 그림 2 참조.
그림 2 에서 보 듯 이 마지막 그림 이 표 시 될 때 목록 뒤에 그림 이 없 는 것 도 Gallery 구성 요소 의 기본 적 인 디 스 플레이 효과 입 니 다.이 글 의 뒷부분 에 서 는 Gallery 구성 요 소 를 마지막 그림 으로 표시 할 때 첫 번 째 그림 부터 표시 하 는 방법 을 자세히 소개 합 니 다.
자,이제 그림 1 과 그림 2 의 효과 가 어떻게 만 들 어 졌 는 지 살 펴 보 자.Gallery 가 그림 을 표시 하 는 데 사 용 된 이상 첫 번 째 단 계 는 그림 파일 을 표시 해 야 합 니 다.지금 은 그림 을 마음대로 준비 할 수 있 습 니 다.본 논문 의 예 에서 jpg 파일 15 개(item 1.jpg 에서 item 15.jpg)를 준비 했다.이 파일 들 을 모두 res\drawable 디 렉 터 리 에 두 십시오.
이 그림 들 의 자원 ID 를 int 배열 에 저장 합 니 다.코드 는 다음 과 같 습 니 다.
private int[] resIds = new int[]
{
R.drawable.item1, R.drawable.item2, R.drawable.item3,
R.drawable.item4, R.drawable.item5, R.drawable.item6,
R.drawable.item7, R.drawable.item8, R.drawable.item9,
R.drawable.item10, R.drawable.item11, R.drawable.item12,
R.drawable.item13, R.drawable.item14, R.drawable.item15
};
이 예 의 main.xml 파일 에 Gallery 구성 요 소 를 설정 하 였 습 니 다.코드 는 다음 과 같 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Gallery android:id="@+id/gallery" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_marginTop="30dp" />
</LinearLayout>
현재 onCreate 방법 에서 이 구성 요 소 를 불 러 옵 니 다.코드 는 다음 과 같 습 니 다.
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Gallery
Gallery gallery = (Gallery) findViewById(R.id.gallery);
// ImageAdapter
ImageAdapter imageAdapter = new ImageAdapter(this);
// Gallery Adapter
gallery.setAdapter(imageAdapter);
}
위의 코드 에서 매우 중요 한 클래스:ImageAdapter.이 종 류 는 android.widget.BaseAdapter 의 하위 클래스 로 이미지 정 보 를 설명 하 는 데 사 용 됩 니 다.다음은 이 종류의 전체 코드 를 먼저 보 겠 습 니 다.
public class ImageAdapter extends BaseAdapter
{
int mGalleryItemBackground;
private Context mContext;
public ImageAdapter(Context context)
{
mContext = context;
// Gallery
TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
mGalleryItemBackground = typedArray.getResourceId(
R.styleable.Gallery_android_galleryItemBackground, 0);
}
//
public int getCount()
{
return resIds.length;
}
public Object getItem(int position)
{
return position;
}
public long getItemId(int position)
{
return position;
}
// ImageView
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView imageView = new ImageView(mContext);
// (position )
imageView.setImageResource(resIds[position]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(163, 106));
// Gallery
imageView.setBackgroundResource(mGalleryItemBackground);
return imageView;
}
}
ImageAdapter 클래스 를 작성 할 때 주의해 야 할 두 가지:1. ImageAdapter 류 의 구조 방법 에서 Gallery 구성 요소 의 속성 정 보 를 얻 었 습 니 다.이 정 보 는 res\values\attrs.xml 파일 에 정의 되 어 있 습 니 다.코드 는 다음 과 같 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Gallery">
<attr name="android:galleryItemBackground" />
</declare-styleable>
</resources>
위의 속성 정 보 는 Gallery 의 배경 스타일 을 설정 하 는 데 사 용 됩 니 다.2. ImageAdapter 클래스 에서 매우 중요 한 방법 은 두 가지 가 있 습 니 다.getCount 와 getView 입 니 다.그 중에서 getCount 방법 은 그림 의 총 수 를 되 돌려 주 는 데 사 용 됩 니 다.주의해 야 할 것 은 이 총 수 는 그림 의 실제 수(그림 의 실제 수 보다 작 을 수 있 음)보다 크 면 안 됩 니 다.그렇지 않 으 면 경계 이상 을 던 질 수 있 습 니 다.Gallery 구성 요소 가 그림 을 표시 하려 면 getView 방법 을 사용 하고 현재 그림 색인(position 매개 변수)을 이 방법 으로 전송 합 니 다.일반 getView 방법 은 그림 을 표시 하 는 모든 구성 요소(ImageView 대상)를 되 돌려 주 는 데 사 용 됩 니 다.이 를 통 해 알 수 있 듯 이 Gallery 구성 요 소 는 모든 그림 을 한꺼번에 표시 하 는 것 이 아니 라 즉시 그림 을 표시 합 니 다.getView 방법 에 서 는 ImageView 대상 을 만 드 는 것 외 에 resIds 배열 에서 해당 하 는 이미지 자원 ID 를 얻어 ImageView 에 표 시 된 그림 을 설정 합 니 다.마지막 으로 갤러리 구성 요소 의 배경 디 스 플레이 스타일 도 설정 했다.
OK,이제 이 프로그램 을 실행 하고 그림 목록 을 드래그 하면 그림 1 과 그림 2 와 같은 효 과 를 볼 수 있 습 니 다.
그림 의 원 리 를 순환 적 으로 표시 합 니 다.
순환 디 스 플레이 는 순환 링크 와 유사 하 며,마지막 노드 의 다음 노드 는 또 첫 번 째 노드 입 니 다.그림 을 반복 해서 보 여 주 는 것 도 이 점 을 모 의 할 수 있다.
세심 한 독자 들 은 지난 절 에 실 현 된 ImageAdapter 류 에서 무엇 을 발견 할 수 있 을 지도 모른다.맞다!getView 방법 중의 position 매개 변수 와 getCount 방법의 관계 입 니 다.position 매개 변수의 값 은 getCount 방법 이 되 돌아 오 는 값 을 초과 할 수 없습니다.즉,position 매개 변수 값 의 범 위 는 0 에서 getCount()-1 입 니 다.
이때 Gallery 구성 요소 가 마지막 그림 에 딱 나타 나 면 position 매개 변수 값 은 getCount()-1 입 니 다.그러면 우 리 는 어떻게 갤러리 에 다음 그림 을 표시 합 니까?즉,position 매개 변수 값 을 1 더 증가 시 키 는 것 입 니 다.맞습니다!getCount()방법의 반환 값 도 1 증가 합 니 다.
그러면 여기 또 하나의 문제 가 있 습 니 다.만약 에 position 매개 변수 값 이 무한 정 증가 하면 resIds 배열 이 계속 커지 고 시스템 의 자원 을 크게 소모 하 는 것 을 의미 합 니 다.이 를 생각하면 두 가지 문 제 를 해결 해 야 합 니 다.position 가 계속 증가 해 야 할 뿐만 아니 라 resIds 배열 에 저 장 된 이미지 자원 ID 도 제한 되 어 있 습 니 다.어떻게 해 야 합 니까?getCount()방법 에 대해 잘 해결 되 었 습 니 다.getCount 방법 을 큰 숫자 로 되 돌려 줄 수 있 습 니 다.예 를 들 어 Integer.MAXVALUE。이때 position 매개 변수 값 은 Gallery 구성 요소 의 그림 이 앞으로 이동 하면 서 커진다.현재 resIds 배열 은 15 개의 요소 만 있 습 니 다.만약 에 position 의 값 이 배열 경 계 를 초과 하면 배열 의 요 소 를 계속 순환 해서 얻 으 려 면(즉,position 의 값 이 15 일 때 resIds 배열 의 0 번 째 요 소 를 취하 고 16 일 때 첫 번 째 요 소 를 취 하 는 것)가장 간단 한 방법 은 나머지 를 취 하 는 것 입 니 다.코드 는 다음 과 같 습 니 다.
resIds[position % resIds.length]
이 절 에서 ImageAdapter 류 에 대해 다음 과 같은 두 가지 개선 을 했 습 니 다.1. getCount 방법 을 큰 값 으로 되 돌려 줍 니 다.Integer.MAX 로 돌아 가 는 것 을 권장 합 니 다.VALUE。
2. getView 방법 에서 나머지 순환 을 통 해 resIds 배열 의 이미지 자원 ID 를 얻 습 니 다.
위의 두 가지 개선 을 통 해 그림 목록 을 오른쪽으로 이동 할 때 그림 을 반복 적 으로 표시 할 수 있 습 니 다.물론 이 방법 은 본질 적 으로 위 순환 일 뿐 입 니 다.즉,getCount 방법 으로 그림 을 되 돌려 주 는 값 으로 이동 하면 마지막 그림 으로 표 시 됩 니 다.그런데 여기 서 getCount 방법 은 Integer.MAX 로 돌 아 왔 습 니 다.VALUE,이 값 은 20 억 이 넘 습 니 다.누 군가 20 억 번 째 위치 로 그림 을 이동 하고 싶 어 하지 않 는 한 Gallery 구성 요 소 는 그림 을 순환 적 으로 표시 하 는 구성 요소 입 니 다.
그림 을 순환 적 으로 보 여 주 는 Gallery 구성 요소
이 절 에 서 는 그림 을 순환 적 으로 표시 하 는 ImageAdapter 류 의 전체 코드 를 구성 합 니 다.독 자 는 그 중에서 지난 절 에 소 개 된 두 가지 개선 점 을 볼 수 있다.화면 을 더욱 풍만 하 게 보이 기 위해 서 이 예 는 Gallery 구성 요소 의 그림 을 클릭 할 때 아래 에 확 대 된 그림 을 표시 합 니 다(ImageSwitcher 구성 요소 사용).이 예의 표시 효 과 는 그림 3 과 같다.그림 을 계속 뒤로 이동 할 때 이미 지 는 계속 표시 되 고 독 자 는 스스로 이 예 를 실행 하여 체험 할 수 있다.
main.xml 파일 에서 정의 하 는 Gallery 와 ImageSwitcher 구성 요소 의 코드 는 다음 과 같 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Gallery android:id="@+id/gallery" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_marginTop="30dp" />
<ImageSwitcher android:id="@+id/imageswitcher"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginTop="30dp" />
</LinearLayout>
이 예 에서 Main 류 의 전체 코드 는 다음 과 같다.
package net.blogjava.mobile;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Gallery.LayoutParams;
import android.widget.ViewSwitcher.ViewFactory;
public class Main extends Activity implements OnItemSelectedListener,
ViewFactory
{
private Gallery gallery;
private ImageSwitcher imageSwitcher;
private ImageAdapter imageAdapter;
private int[] resIds = new int[]
{ R.drawable.item1, R.drawable.item2, R.drawable.item3, R.drawable.item4,
R.drawable.item5, R.drawable.item6, R.drawable.item7,
R.drawable.item8, R.drawable.item9, R.drawable.item10,
R.drawable.item11, R.drawable.item12, R.drawable.item13,
R.drawable.item14, R.drawable.item15 };
public class ImageAdapter extends BaseAdapter
{
int mGalleryItemBackground;
private Context mContext;
public ImageAdapter(Context context)
{
mContext = context;
TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
mGalleryItemBackground = typedArray.getResourceId(
R.styleable.Gallery_android_galleryItemBackground, 0);
}
// 1 , , ,Integer.MAX_VALUE
public int getCount()
{
return Integer.MAX_VALUE;
}
public Object getItem(int position)
{
return position;
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView imageView = new ImageView(mContext);
// 2 , resIds ID
imageView.setImageResource(resIds[position % resIds.length]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(163, 106));
imageView.setBackgroundResource(mGalleryItemBackground);
return imageView;
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,long id)
{
// Gallery , ImageSwitcher
imageSwitcher.setImageResource(resIds[position % resIds.length]);
}
@Override
public void onNothingSelected(AdapterView<?> parent)
{
}
@Override
// ImageSwitcher View ( ImageView )
//
public View makeView()
{
ImageView imageView = new ImageView(this);
imageView.setBackgroundColor(0xFF000000);
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setLayoutParams(new ImageSwitcher.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
return imageView;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
gallery = (Gallery) findViewById(R.id.gallery);
imageAdapter = new ImageAdapter(this);
gallery.setAdapter(imageAdapter);
gallery.setOnItemSelectedListener(this);
imageSwitcher = (ImageSwitcher) findViewById(R.id.imageswitcher);
// ImageSwitcher
imageSwitcher.setFactory(this);
// ImageSwitcher
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
}
}
총결산이 글 은 순환 적 으로 표시 할 수 있 는 Gallery 구성 요 소 를 어떻게 실현 하 는 지 소개 한다.실제로 이 순환 디 스 플레이 는 가짜 순환 일 뿐 이지 만 getCount 방법 으로 되 돌아 오 는 이미지 의 총수 가 매우 크기 때문에(20 억 이상)무한 순환 에 가깝다 는 것 을 의미한다.그림 을 순환 적 으로 표시 하 는 관건 은 다음 과 같다.
1. getCount 방법 은 매우 큰 정수 치 를 되 돌려 줍 니 다(예 를 들 어 Integer.MAXVALUE)。
2. getView 방법 에서 나머지 를 취 하 는 방법 으로 그림 의 자원 ID 를 순환 적 으로 얻 습 니 다.
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.,,,,,,,
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.