Android Drawable Resource 학습(7), TransitionDrawable

11960 단어
하나의 TransitionDrawable는 두 drawable 자원 사이의 페이드 효과를 실현할 수 있는 특수한 Drawable 대상입니다.
노드 아래의 모든 은drawable 자원을 대표합니다. 두 개만 가능합니다.이전 변환 호출startTransition().뒤로 reverseTransition().
파일 위치:res/drawable/filename.xml
파일 이름을 자원 ID로 지정
컴파일 자원 유형:
가리키다TransitionDrawable의 포인터
자원 참조:
In Java: R.drawable.filename
In XML: @[package:]drawable/filename
구문:
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</transition>

요소:<transition>
반드시하나 이상의 요소를 포함하는 루트 노드여야 합니다.
속성:xmlns:android
문자열 유형,
반드시XML 파일의 이름공간을 정의합니다."http://schemas.android.com/apk/res/android" . <item>
TransitionDrawable에 사용되는 drawable를 정의합니다.반드시<transition> 。 <bitmap> 。
속성:android:drawable
Drawable 리소스.반드시Drawable 리소스를 참조합니다.android:id
자원 ID입니다.drawable 자원의 유일한 표식입니다. "@+id/name" 방식으로 이 item에 새로운 자원 ID를 정의합니다.사용 가능View.findViewById() 또는Activity.findViewById() 등 방식으로 이 item을 검색하고 수정합니다.android:top
Integer. 위쪽과의 거리android:right
Integer.오른쪽과의 거리android:bottom
Integer. 아래와의 거리android:left
Integer.왼쪽과의 거리
예:
XML 파일 저장:res/drawable/transition.xml :
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/on" />
    <item android:drawable="@drawable/off" />
</transition>

layout 파일에서 다음을 사용합니다.
<ImageButton
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/transition" />

And the following code performs a 500ms transition from the first item to the second:
ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);

참고 자료
  • TransitionDrawable

  • 다음은 인스턴스입니다.
    1. xml 방식 사용
    transition.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <item android:drawable="@drawable/image01"/>
        <item android:drawable="@drawable/image02"/>
    
    </transition>

    layout에서 다음을 사용합니다.
        <ImageView 
            android:id="@+id/imgView"
            android:src="@drawable/transition"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    코드에서 제어하기
    ImageView imageView = (ImageView) findViewById(R.id.imgView);
            TransitionDrawable transitionDrawable = (TransitionDrawable) imageView.getDrawable();
            transitionDrawable.startTransition(3000);

    다음은 실례입니다. 여러 장의 그림이 순환하는 덤핑 덤핑 효과를 실현합니다.
    package com.example.drawabletest;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.graphics.drawable.TransitionDrawable;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
        private int change=0;
        private int[] ids = new int[] { R.drawable.image1, R.drawable.image2, R.drawable.image3,
                R.drawable.image4, R.drawable.image5 };
        private Drawable[] drawables;
        private ImageView imageView;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            imageView = (ImageView) findViewById(R.id.imgView);
    
            /*     drawable  */
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inJustDecodeBounds = true;
            BitmapFactory.decodeResource(getResources(), R.drawable.image1, opts);
            opts.inSampleSize = computeSampleSize(opts, -1, 500 * 500);
            opts.inJustDecodeBounds = false;
            drawables=new Drawable[ids.length];
            try {
                for (int i = 0; i < ids.length; i++) {// for  ,  5 drawable  
                    Bitmap bmp = BitmapFactory.decodeResource(getResources(), ids[i], opts);
                    drawables[i] = new BitmapDrawable(bmp);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            //    ,  transition
            new Thread(new MyRunnable()).start();
            
        }
    
        //  transition   
        private Handler handler=new Handler(new Handler.Callback() {
            public boolean handleMessage(Message msg) {
                int duration=msg.arg1;
                TransitionDrawable transitionDrawable=null;
                transitionDrawable= new TransitionDrawable(new Drawable[] {
                            drawables[change%ids.length],//   0 1 2 3 4 5 0 1 2.。。       
                            drawables[(change+1)%ids.length] });
                change++;
                imageView.setImageDrawable(transitionDrawable);
                transitionDrawable.startTransition(duration);
                return false;
            }
        });
        
        //  ,     , transition    
        private class MyRunnable implements Runnable{
            public void run() {
                while (true) {
                    int duration=3000;//     
                    Message message=handler.obtainMessage();
                    message.arg1=duration;
                    handler.sendMessage(message);
                    try {
                        Thread.sleep(duration);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
        
        //         
        public static int computeSampleSize(BitmapFactory.Options options, int minSideLength,
                int maxNumOfPixels) {
            int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
    
            int roundedSize;
            if (initialSize <= 8) {
                roundedSize = 1;
                while (roundedSize < initialSize) {
                    roundedSize <<= 1;
                }
            } else {
                roundedSize = (initialSize + 7) / 8 * 8;
            }
    
            return roundedSize;
        }
    
        //         
        private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength,
                int maxNumOfPixels) {
            double w = options.outWidth;
            double h = options.outHeight;
    
            int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h
                    / maxNumOfPixels));
            int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(
                    Math.floor(w / minSideLength), Math.floor(h / minSideLength));
    
            if (upperBound < lowerBound) {
                // return the larger one when there is no overlapping zone.
                return lowerBound;
            }
    
            if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
                return 1;
            } else if (minSideLength == -1) {
                return lowerBound;
            } else {
                return upperBound;
            }
        }
    }
    

    좋은 웹페이지 즐겨찾기