안드로이드 비주얼 최적화 - 스트레칭 애니메이션

처음으로 블로그를 쓰는데, 부족한 점은 본 막내 동생을 많이 포함해 주십시오.
블로그를 배우기 시작한 것은 한 BAT 대신이 쓴 글을 보고 느낀 데서 비롯되었다. 지금까지 머리를 쓰지 않고 필기를 했기 때문에 이것이 사실이라는 것을 인정하지 않을 수 없었기 때문에 생각해 보면 옳다.본인은 총명한 편은 아니니, 부지런하면 졸렬함을 보충할 수 있기를 바랍니다.왜 애니메이션을 씁니까?
일을 처음 접한 많은 학우들도 감명을 받았다고 믿는다. 애니메이션이라는 것은 멋있어 보이고 자기가 쓰기가 어려워진다. 마지막에 자신이 도대체 기술적인 문제인지 심미적인 문제인지 의심해야 한다.어쨌든 구덩이를 밟았다는 믿음도 적지 않다.이 아이도 피해자 중 한 명이니 쓸데없는 말 없이 바로 본론으로 들어간다.
먼저, Android 애니메이션은 트윈 애니메이션, 속성 애니메이션, 프레임 애니메이션 등 크게 세 가지로 나눌 수 있습니다.후자가 사용하는 장면은 매우 적다.가장 많이 사용된 것은 앞의 두 가지인데 그 중에서 속성 애니메이션은 공식 API에서 API 14, 즉 안드로이드 4.0까지만 지원한다.물론 유대신은 API14 이하의 호환 패키지를 제시했고 사용법은 거의 일치했다.가장 많이 사용된 것은 앞의 두 가지인데 그 중에서 속성 애니메이션은 공식 API에서 API 14, 즉 안드로이드 4.0까지만 지원한다.물론 유대신은 API14 이하의 호환 패키지를 제시했고 사용법은 거의 일치했다.NineOldAndroids 속성 애니메이션.
그러면 개발 중 어떤view의 높이를 다시 설정하려면 일반적인 방법은
ViewGroup.LayoutParams params = content.getLayoutParams();
            params.height=value;
            content.setLayoutParams(params);

콘텐츠 리셋의 높이를 실현하지만, 실제 기기에서는 효과가 그리 좋지 않다. 환상적이고 딱딱한 느낌이 든다.그러면 여기서 속성 애니메이션을 사용하여 이 문제를 해결할 수 있다.
왜 모션 트윈을 사용하지 않습니까?모션 트윈을 사용하는 경우 스트레칭도 가능합니다.이때 두 가지 문제가 발생한다.
첫째, 트윈 애니메이션은 시각적으로 당신이 원하는 애니메이션 효과를 얻었지만 실행하는 과정에서 프로그램 내부에서 onmeasure()와 onlayout()를 호출하지 않았고 ondraw()만 호출했다. 즉, 이때 당신이 본 것은 당신이 본 것이 아니라 속성이 변하지 않았다는 것이다.view의 top,left,right.bottom 네 개의 속성은 변하지 않았습니다.
둘째, 이 문제의 출현도 첫 번째 원인이다. 애니메이션을 하는view 주위의 모든view는 그 위치가 애니메이션view의 위치나 모양의 변화에 따라 바뀌지 않는다. 이것은 큰 문제이기 때문에 트윈 애니메이션을 사용하지 않고 속성 애니메이션을 사용한다.
네, BB 그만하세요. 코드 드셔보세요...
메인 인터페이스는 activitymain.xml은LinearLayout으로 3개의 View, 제목 View, 스트레칭 내용 View, 끝부분 View를 감싸고 있습니다.
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context="com.demotest.testdemo.MainActivity">

    <RelativeLayout
        android:id="@+id/toggle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:gravity="center_vertical"
            android:background="#cccccc"
            android:text="  "/>
        <ImageView
            android:id="@+id/arrow"
            android:layout_width="20dp"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp"
            android:layout_height="20dp"
            android:src="@drawable/down_arrow"/>

    </RelativeLayout>


    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:background="#666666"
        android:textColor="#ffffff"
        android:text="Hello World!"
        android:orientation="horizontal"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="center_vertical"
        android:background="#ff0000"
        android:textColor="#ffffff"
        android:text="    "/>

</LinearLayout>
</pre><pre>

4
 在MainActivity的onCreate方法中,初始化view,初始化动画content的初始状态。 
  
 
 
 
 
 
 
 
 点击标题,content响应: 
  
  
 
private void toggleContent(boolean animation) {
    content.measure(0, 0); //    
    int measuredHeight = content.getMeasuredHeight();

    if (isOpen) {
        //1.    
        if (animation) {

            //       --    
            int start = measuredHeight;
            int end = 0;
            ValueAnimator animator = ValueAnimator.ofInt(start, end);
            animator.setDuration(400);
            animator.addUpdateListener(animationListener);
            animator.start();
            //2.        
            ObjectAnimator.ofFloat(arrow, "rotation", -180, 0).setDuration(400).start();

        } else {
            //     
            ViewGroup.LayoutParams params = content.getLayoutParams();
            params.height = 0;
            content.setLayoutParams(params);

            arrow.setRotation(0);

        }


    } else {
        //1.    
        if (animation) {

            //       --    
            int start = 0;
            int end = measuredHeight;
            ValueAnimator animator = ValueAnimator.ofInt(start, end);
            animator.setDuration(400);
            animator.addUpdateListener(animationListener);
            animator.start();
            //2.        
            ObjectAnimator.ofFloat(arrow, "rotation", 0, 180).setDuration(400).start();
        } else {
            //     
            ViewGroup.LayoutParams params = content.getLayoutParams();
            params.height = measuredHeight;
            content.setLayoutParams(params);

            arrow.setRotation(180);
        }


    }

    isOpen = !isOpen;
}
애니메이션 프로세스 감청기를 등록하고 LayoutParams의 Height 속성을 끊임없이 설정한다.스트레칭 효과 구현.
private ValueAnimator.AnimatorUpdateListener animationListener = new android.animation.ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int value = (int) animation.getAnimatedValue();
        ViewGroup.LayoutParams params = content.getLayoutParams();
        params.height = value;
        content.setLayoutParams(params);

    }
};

효과 보기:

좋은 웹페이지 즐겨찾기