뷰어 사진과 갤러리는 다음과 같은 결과를 달성하기 위해 :
아이디어의 실현,
스위치 인터페이스 상기 이미지를 사용하여
갤러리를 사용하여 아래
1. 위의 스위칭 포토 팩토리 구성의 사용을 필요로 내용물의 구성 : 배경 색상, 이미지가 표시되면, 줌 비율, 레이아웃 파라미터 아웃 애니메이션 이미지
2. 다음 baseadapter 갤러리 화면에 표시된 화상을, (생성자가 내부 충전) 필요
3. 그러한되는 이벤트의 실현이 선택한 항목 아래의 갤러리 표시 될 수 있는지에 대한 상기 뷰
이것은 처음 세 단계는 위에서 제시 갤러리 제어 슬라이드 주위 달성 될 수있는 아래의 슬라이드
실현의 자동 변환 :
4. 상기 과금 동작은 메인 쓰레드에 이용 될 수 없기 때문에,이 회계 동작이 서브 스레드 완료 자식 스레드를 개방 할 필요가있다,
열기 아이 thread, 하위 스레드에서, 타이밍이 선택한 항목 갤러리를 변경 달성하기 위해
효과 사용자 인터페이스의 변경의 입력 타이밍의 변화는 UI 앤드류스 서브 스레드의 변화를 구현할 수 없다
그래서 여기가 메시지 메커니즘이라는 것을 도입
메시지 전송 6. 핸들, 마스터는, 스레드, 수신 된 데이터의 판정을받은 후 메인 스레드를 수신 할 준비
심사가 완료되면 적절한 조치를 만들어, 여기에 UI를 변경하고,
코드입니다
레이아웃 파일, 스위치가 인터페이스를 완료하려면 그냥 넣어 사진 갤러리 장소 위,
<? XML 버젼 = "1.0"인코딩 = "UTF-8" ?> < RelativeLayout의 XMLNS 안드로이드 = "http://schemas.android.com/apk/res/android" 의 xmlns : 도구 = "http://schemas.android .COM / 도구 " 안드로이드 : layout_width ="match_parent " 안드로이드 : layout_height ="match_parent " 안드로이드 : paddingBottom ="@ DIMEN / activity_vertical_margin " 안드로이드 : paddingLeft ="@ DIMEN / activity_horizontal_margin " 안드로이드 : paddingRight ="@ DIMEN / activity_horizontal_margin " 안드로이드 : paddingTop = "@ DIMEN / activity_vertical_margin" 도구 :> < 갤러리 로이드 : ID = "@ + ID / GLR" 로이드 : layout_width = "match_parent" 로이드 : layout_height = "200dp" 로이드 : layout_alignParentBottom = "true"로 로이드 중력 = "센터" 로이드 : 공간 = "5dp" / > < ImageSwitcher의 로이드 : ID = "@ + ID / imgSwt" 로이드 : layout_width = "fill_parent" 로이드 : layout_height = "match_parent" 로이드 : paddingBottom = "5dp" 로이드 : layout_above = "@ + ID / GLR " > </ ImageSwitcher > </ RelativeLayout의 >
로직 코드 :
패키지 com.example.xialm.gallery_circulation; 수입 android.os.Message; 수입 android.support.v7.app.AppCompatActivity; 수입 android.os.Bundle; 수입 android.view.View에서; 수입 android.widget.Gallery; 수입 android.widget.ImageSwitcher; 수입 android.widget.ImageView; 수입 android.widget.ViewSwitcher; 수입 android.R.integer; 수입 에는 android.app.Activity; 수입 android.os.Bundle; 수입 android.os.Handler; 수입 android.os.Message; 수입android.provider.MediaStore.Images; 수입 android.view.View에서; 수입 android.view.ViewGroup; 수입 android.view.animation.AnimationUtils; 수입 android.widget.AdapterView; 수입 android.widget.AdapterView.OnItemSelectedListener; 수입 android.widget.BaseAdapter; 수입 android.widget.Gallery; 수입 android.widget.Gallery.LayoutParams; 수입 android.widget.ImageSwitcher; 수입 android.widget.ImageView; 수입 android.widget.ViewSwitcher.ViewFactory; 공공 클래스 MainActivity는 확장AppCompatActivity { // 화상 스위치 ImageSwitcher imageSwitcher은; // 갤러리 갤러리 GLR; // 자원은 그리기 디렉토리에 표시 할 INT [] imgs = {R.drawable.a, R.drawable.b, R.drawable.c , R.drawable.d, R.drawable.e, R.drawable.f} // 이미지 그룹 이미지 뷰 [] = galleryViews 새로운 새 이미지 뷰 [imgs.length] @Override가 보호 공간 에서 onCreate (번들 savedInstanceState) { 슈퍼 .onCreate (savedInstanceState) 된 setContentView (R.layout.activity_main); // 찾을 우려 제어 imageSwitcher = (imageSwitcher) findViewById를 (R.id.imgSwt)를; GLR = (갤러리)를 같이 findViewById (R.id.glr); // 그림 스위치에 사진을 추가가 ,, 공장 공장은 부모 창 사진과의 역할 구분하는 데 사용됩니다 imageSwitcher.setFactory을 ( 새로운 새로운 ViewSwitcher.ViewFactory () { @Override 공공 보기 makeView () { // TODO 장 자동 생성 방법 스텁 // 이미지 뷰 IV = 새로운 새 이미지 뷰합니다 (MainActivity. 이 본를 ) // 배경색 세트 iv.setBackgroundColor (16 진수 표기는 0xFF000000 ) // 화상 표시 볼 때의 비율에 대한 스케일링 및 화상 표시 장치의 전체 또는 부분의 이미지 표시 , iv.setScaleType (ImageView.ScaleType.CENTER_INSIDE를) // 다음 파라미터 일반적 3,4 / * 1. SetScaleType (ImageView.ScaleType.CENTER) 을 중심으로 영상의 원본 크기에 따라 때 이미지 길이 / 길이보기 위에 폭 / 폭은, 촬영 표시 화상의 중앙부, 2 setScaleType (ImageView.ScaleType.CENTER_CROP)는, 화상의 길이 (폭)는 동일하거나보기 (폭)의 길이보다 크도록 조정 된 이미지의 크기는 중심 3. setScaleType합니다 (이미지 뷰. ScaleType.CENTER_INSIDE) 전체 디스플레이 화상의 내용을 중심으로, 또는 길이 / 폭 이하인보기 길이 / 폭되도록 원본 영상 크기를 축소하는 것이다 4. setScaleType (ImageView.ScaleType.FIT_CENTER)는, 이미지를 스케일 업 / 뷰 폭으로 감소하고, 중심 제 FIT_START, FIT_END을 FIT_CENTER 줌 효과 그림에서와 같이 다른 위치는 그냥 FIT_START는 하단의 상단 FIT_CENTER 센터, FIT_END에 배치됩니다 보여줍니다. 6. FIT_XY는 목표는 전체 사진보기를 채우는 것입니다, 사진을 축소하지. * / // 설정 레이아웃 매개 변수 iv.setLayoutParams ( 새로운 새 ImageSwitcher.LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 반환 IV; } }); //는 , 애니메이션 애니메이션 나오는 (imageSwitcher.setInAnimation에게 (AnimationUtils.loadAnimation을 이 본 , android.R.anim .fade_in)); imageSwitcher.setAnimation (AnimationUtils.loadAnimation ( 이 본 , android.R.anim.fade_out)); // 이미지보기 이미지 리소스 추가 대 ( INT I <galleryViews.length; I는 I = 0 ++ ) { 이미지 뷰를 IV = 새로운 새 이미지 뷰합니다 (MainActivity. 이 본 ); iv.setImageResource (imgs [I]); (iv.setAdjustViewBounds 는 true ); // 당신은 가로 세로 비율을 유지하고, 필요와 최대 너비 MaxHeight입니다은 하나의 무효와 함께 사용할 경우 iv.setLayoutParams ( 새로운 새로운 Gallery.LayoutParams (LayoutParams.WRAP_CONTENT,의 LayoutParams에 대한 .WRAP_CONTENT)); galleryViews [I] = IV; } // 갤러리는 어댑터, 익명 클래스 추가 glr.setAdapter을 ( 새로운 새로운 BaseAdapter () { @Override 공공 galleryViews [는 arg0];보기의 getView ( INT의 것들은 arg0,보기 ARG1, 뷰 그룹 ARG2) { // TODO 자동 생성 방법 스텁 반환 } @Override 공용 긴 주는 getItemId ( INT의 것들은 arg0) { // TODO 방법 스터브 자동 생성 복귀 arg0를하는 단계; } @Override 공공 오브젝트의 getItem ( INT의 것들은 arg0) { // TODO 방법 스텁 자동 생성 반환 널 (null)을 ; } // 个数和图片个数一样 @Override 공개 INT getCount () { // TODO 방법 스터브 자동 생성 복귀 imgs.length 단계; } }); // 이벤트 리스너, 위의 그림 이미지 디스플레이 스위치가에 대한 응답으로 청취 메시징 이벤트 설정 glr.setOnItemSelectedListener을 ( 새로운 새로운 OnItemSelectedListener를 ( ) { @Override 공개 공극 onItemSelected합니다 (어댑터 뷰 AdapterView <?> arg0에서, 뷰 ARG1, INT의 ARG2, 롱 에서 arg3) { // TODO 장 자동 생성 방법 스텁 // 설정 화상 표시 imageSwitcher.setImageResource을 (imgs [ARG2]); } @Override 공개 공극 onNothingSelected합니다 (어댑터 뷰 AdapterView <?> 는 arg0) { // TODO 장 자동 생성 방법 스텁 } }); // 우리는이 부분에 지연이 있지만 원리는 주에 프로그램 안드로이드되지 달성 할 콘텐츠 이후 지연 동작은 스레드가 발생 // 다음 데이터 처리 서브 스레드에서 구현 될 수있다 이후, 메인 쓰레드에 메시지를 보낼 수 있도록, // 수신 된 메시지이면 메인 쓰레드로 처리한다 // 메인 스레드 동작 수신 최종 핸들러 hhHandler가 = 새로운 새로운 핸들러 () { @Override 공공 무효 handleMessage (메시지 MSG) { // 해야할 일 자동 생성 방법 스텁 //삭제 상속 // super.handleMessage (MSG) // 서브 스레드에 전송되는 데이터가있어 INT의 P를 = msg.what을, glr.setSelection (P)를; } } // 자식 스레드를 열고 메인 쓰레드로 부 데이터를 사용하여 나사 복귀가 UI 변경 새로운 새로운 스레드 () { / / 재정의 실행 방법 공공 무효 실행 () { // 하위 스레드의 코드 INT의 I = 0 ; 그동안 (. 내가 <6 ) { // 수면, 1000MS 은 try { 에 Thread.sleep ( 1000 ); } 캐치(예외 : InterruptedException E) { // 해야할 일 블록을 캐치 자동 생성 e.printStackTrace (); } 메시지 mm = 새로운 새로운 메시지 (); //를 어떤 메시지 표시되어 mm.what = I; // Handler를 인스턴스화하는 메인 스레드에서 hhHandler을 .sendMessage (mm); // , 패스 저장 다음 두하에 전달 제가 ++ ; IF를 (. I == 6 ) { I = 0 ; } } }; }.스타트(); } }