zoukankan      html  css  js  c++  java
  • 第三章、android入门

    安卓入门

    五、动画

    1、逐帧动画(frame-by-frame animation)
    • frame.xml(必须放在drawable下)
    <?xml version="1.0" encoding="utf-8"?>
    <!--android:oneshot值为true表示只执行一次-->
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
        <item android:drawable="@drawable/anim1" android:duration="120"/>
        <item android:drawable="@drawable/anim2" android:duration="120"/>
        <item android:drawable="@drawable/anim3" android:duration="120"/>
        <item android:drawable="@drawable/anim4" android:duration="120"/>
        <item android:drawable="@drawable/anim5" android:duration="120"/>
        <item android:drawable="@drawable/anim6" android:duration="120"/>
        <item android:drawable="@drawable/anim7" android:duration="120"/>
        <item android:drawable="@drawable/anim8" android:duration="120"/>
        <item android:drawable="@drawable/anim9" android:duration="120"/>
        <item android:drawable="@drawable/anim10" android:duration="120"/>
    </animation-list>
    
    • activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/iv"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:background="@drawable/frame" />
    
    </LinearLayout>
    
    • MainActivity
    public class MainActivity extends AppCompatActivity {
        private Boolean flag = true;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ImageView iv = findViewById(R.id.iv);
            AnimationDrawable anim = (AnimationDrawable) iv.getBackground();
            iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (flag) {
                        anim.start();
                        flag = false;
                    } else {
                        anim.stop();
                        flag = true;
                    }
                }
            });
    
        }
    }
    
    2、补间动画(tweened animation:不会改变控件的真实坐标)
    a、xml方式
    • alpha.xml(必须放在anim下)
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <alpha
            android:duration="2000"
            android:fromAlpha="0"
            android:toAlpha="1" />
    
    </set>
    
    • rotate.xml(必须放在anim下)
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <!--android:pivotX="50%":参照物为自己;当参照物为父节点时,值后加p(50%p)-->
        <rotate
            android:duration="2000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" />
    
    </set>
    
    • scale.xml(必须放在anim下)
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <scale
            android:duration="2000"
            android:fromXScale="1"
            android:fromYScale="1"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="0.5"
            android:toYScale="0.5" />
    
    </set>
    
    • translate.xml(必须放在anim下)
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <translate
            android:duration="2000"
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="100"
            android:toYDelta="100" />
    
    </set>
    
    • activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ImageView
            android:id="@+id/iv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:adjustViewBounds="true"
            android:maxWidth="300dp"
            android:maxHeight="300dp"
            android:src="@drawable/img" />
    
    </RelativeLayout>
    
    • MainActivity
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ImageView imageView = findViewById(R.id.iv);
            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
                    // Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
                    // Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.scale);
                    Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate);
                    imageView.startAnimation(animation);
                }
            });
        }
    }
    
    b、代码方式
    • MainActivity
    public class MainActivity extends AppCompatActivity {
        private TextView tv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tv = findViewById(R.id.tv);
        }
    
        public void alphaHandle(View view) {
            //透明程度0~1,0表示透明,1表示不透明
            AlphaAnimation aa = new AlphaAnimation(1, 0);
            aa.setDuration(2000);//设置动画执行时间
            aa.setRepeatCount(1);//设置动画重复次数
            aa.setRepeatMode(Animation.REVERSE);//设置动画重复模式
            tv.startAnimation(aa);
        }
    
        public void rotateHandle(View view) {
            /**
             * 参数1:起始角度;参数2:结束角度;
             * 参数3:X轴参照物;参数4:X轴参照物位置比值
             * 参数5:Y轴参照物;参数6:Y轴参照物位置比值
             */
            RotateAnimation ra = new RotateAnimation(0, 360,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            ra.setDuration(2000);//设置动画执行时间
            ra.setRepeatCount(1);//设置动画重复次数
            ra.setRepeatMode(Animation.REVERSE);//设置动画重复模式
            tv.startAnimation(ra);
        }
    
        public void scaleHandle(View view) {
            /**
             * 参数1:X轴起始倍数;参数2:X轴结束倍数;
             * 参数3:Y轴起始倍数;参数4:Y轴结束倍数;
             * 参数5:X轴参照物;参数6:X轴参照物位置比值
             * 参数7:Y轴参照物;参数8:Y轴参照物位置比值
             */
            ScaleAnimation sa = new ScaleAnimation(1, 2, 1, 2,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            sa.setDuration(2000);//设置动画执行时间
            sa.setRepeatCount(1);//设置动画重复次数
            sa.setRepeatMode(Animation.REVERSE);//设置动画重复模式
            tv.startAnimation(sa);
        }
    
        public void translateHandle(View view) {
            /**
             * 参数1:X轴起点参照物;参数2:X轴起点对比原点位移距离与X轴起点参照物长度的比值;
             * 参数3:X轴终点参照物;参数4:X轴终点对比原点位移距离与X轴终点参照物长度的比值;
             * 参数5:Y轴起点参照物;参数6:Y轴起点对比原点位移距离与Y轴起点参照物长度的比值;
             * 参数7:Y轴终点参照物;参数8:Y轴终点对比原点位移距离与Y轴终点参照物长度的比值;
             */
            TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0,
                    Animation.RELATIVE_TO_PARENT, 0.5f,
                    Animation.RELATIVE_TO_PARENT, 0,
                    Animation.RELATIVE_TO_PARENT, 0.5f);
            ta.setDuration(2000);
            ta.setFillAfter(true);//当动画结束后,停留在结束的位置上
            tv.startAnimation(ta);
        }
    
        public void composeHandle(View view) {
            AlphaAnimation aa = new AlphaAnimation(1, 0);
            aa.setDuration(2000);//设置动画执行时间
            aa.setRepeatCount(1);//设置动画重复次数
            aa.setRepeatMode(Animation.REVERSE);//设置动画重复模式
    
            RotateAnimation ra = new RotateAnimation(0, 360,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            ra.setDuration(2000);//设置动画执行时间
            ra.setRepeatCount(1);//设置动画重复次数
            ra.setRepeatMode(Animation.REVERSE);//设置动画重复模式
    
            ScaleAnimation sa = new ScaleAnimation(1, 2, 1, 2,
                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            sa.setDuration(2000);//设置动画执行时间
            sa.setRepeatCount(1);//设置动画重复次数
            sa.setRepeatMode(Animation.REVERSE);//设置动画重复模式
    
            AnimationSet as = new AnimationSet(true);
            as.addAnimation(aa);
            as.addAnimation(ra);
            as.addAnimation(sa);
            tv.startAnimation(as);
        }
    }
    
    3、属性动画(property animation:会改变控件的真实坐标)
    a、单个动画
    • activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="你好世界" />
    
    </RelativeLayout>
    
    • MainActivity
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // ValueAnimator
            ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
            valueAnimator.setDuration(2000);
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    float value = (float) animation.getAnimatedValue();
                    Log.e("ll", value + "");
                }
            });
            valueAnimator.start();
    
            // ObjectAnimator
            TextView textView = findViewById(R.id.tv);
            ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView, "alpha", 0f, 1f);
            objectAnimator.setDuration(2000);
            objectAnimator.start();
            // 动画监听器
            /*
            objectAnimator.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {
                }
                @Override
                public void onAnimationEnd(Animator animation) {
                }
                @Override
                public void onAnimationCancel(Animator animation) {
                }
                @Override
                public void onAnimationRepeat(Animator animation) {
                }
            });
            */
            //AnimatorListenerAdapter继承自Animator.AnimatorListener,并将所有方法默认实现
            objectAnimator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationStart(Animator animation) {
                    super.onAnimationStart(animation);
                }
            });
        }
    }
    
    b、组合动画
    • MainActivity
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView tv = findViewById(R.id.tv);
    
            //定义动画集
            AnimatorSet as = new AnimatorSet();
            ObjectAnimator oa1 = ObjectAnimator.ofFloat(tv, "alpha", 1f, 0f, 1f);
            ObjectAnimator oa2 = ObjectAnimator.ofFloat(tv, "scaleX", 1f, 0.5f, 1f);
            ObjectAnimator oa3 = ObjectAnimator.ofFloat(tv, "rotation", 0f, 360f, 0f);
            ObjectAnimator oa4 = ObjectAnimator.ofFloat(tv, "translationX", 0f, 300f, 0f);
            as.setDuration(2000);
            as.setTarget(tv);
            //动画依次执行
            //as.playSequentially(oa1, oa2, oa3, oa4);
            //动画一起执行
            as.playTogether(oa1, oa2, oa3, oa4);
            as.start();
        }
    }
    
    c、xml方式动画
    • my_animator.xml(必须放在animator下)
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <objectAnimator
            android:duration="2000"
            android:propertyName="translationX"
            android:valueFrom="0"
            android:valueTo="100" />
    </set>
    

    六、单位和尺寸

    1、px与pt的区别
    1、px:pixels(像素),不同设备显示效果相同
    2、pt:point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用
    
    2、dp与sp的作用
    1、dip:device independent pixels(设备独立像素),不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素
    2、dp:就是dip
    3、sp:scaled pixels(放大像素),主要用于字体显示best for textsize
    
    3、LayoutParams是什么
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // setContentView(R.layout.activity_main);
    
            // LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息
            LinearLayout linearLayout = new LinearLayout(this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            linearLayout.setLayoutParams(layoutParams);
    
            TextView textView = new TextView(this);
            textView.setText("周洁琼");
            textView.setBackgroundColor(0xffff0000);
            // px
            LinearLayout.LayoutParams textLayoutParams = new LinearLayout.LayoutParams(300, 300);
            // textView.setLayoutParams(textLayoutParams);
            // linearLayout.addView(textView);
            linearLayout.addView(textView, textLayoutParams);
    
            setContentView(linearLayout);
        }
    }
    
  • 相关阅读:
    Remove Element
    C++ 一些STL
    Two Pointers/hash/3Sum/4Sum类题目
    动态规划
    UVa 12657 双向链表
    并行运行环境
    多线程编程
    HTML XML CSS JS 迅速学习
    UVa 11988 数组模拟链表
    静态链表
  • 原文地址:https://www.cnblogs.com/linding/p/15544498.html
Copyright © 2011-2022 走看看