16. 스위치 ImageSwitcher 사진 갤러리와 갤러리, 하위 스레드는 자동으로 인터페이스를 전환

뷰어 사진과 갤러리는 다음과 같은 결과를 달성하기 위해 :

 

아이디어의 실현,

스위치 인터페이스 상기 이미지를 사용하여

갤러리를 사용하여 아래

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 ; 
                    } 
                } 
            };

        }.스타트(); 

    } 
}

 

추천

출처www.cnblogs.com/gzyx/p/11778716.html