【Android studio】ViewPager和动画Animation

1.点击事件监听机制

Android程序中,设置View的点击事件监听主要有四种,分别是:
1)在布局文件中为控件设置onClick属性,并在Activity中定义点击事件处理方法;
2)创建匿名内部类,即在为控件设置监听时直接创建一个OnClickListener实例,不为该实例指定名称;

  Button btn=findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(RatingbarActivity.this,xiangce.class);
                startActivity(intent);
            }

3)创建一个内部类实现OnClickListener接口并重写onClick()方法, 之后需要为控件设置
setOnClickListener(Listener listener);
①先定义内部类;

class OnClickHandler implements View.OnClickListener {
        @Override

        public void onClick(View v) {
            /*获取EditText控件中的用户名和密码*/

            nameEditText = findViewById(R.id.user_edit_text);
            passwordEditText = findViewById(R.id.password_edit_text);
            String name = nameEditText.getText().toString().trim();
            String password = passwordEditText.getText().toString().trim();
            /*若用户名为“liu”,且密码为“123456”,则提示用户“登录成功”*/

            switch (v.getId()) {
                case R.id.login_button:
                    if (name.equals("liu") && password.equals("123456")) {
                        Toast.makeText(MainActivity.this, "登录成功!", 

Toast.LENGTH_SHORT).show();
                   }
                    break;
           }

②然后在onCreate()方法中调用OnClickHandler的方法onClick();

loginButton = findViewById(R.id.login_button);
loginButton.setOnClickListener(new OnClickHandler());

4)主类中实现OnclickListener接口,然后重写onClick()方法。

2.实现两个Activity之间的界面跳转

  1. Intent中文翻译为“意图”,它是Android程序中各个组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
  2. Intent一般用于启动Activity、启动服务、发送广播等,承担了Android应用程序三大核心组件相互间的通信功能。
  3. Intent启动Activity的方法有:
    startActivity(Intent intent)
    startActivityForResult(Intent intent,int code)
显示意图
//显示1
 Intent intent=new Intent(RatingbarActivity.this,xiangce.class);
 startActivity(intent);
 
 //显示2
Intent intent = new Intent();
intent.setClass(this, xiangce.class);   
startActivity(intent);  
  1. 显式意图还可以根据目标组件的包名、全路径名来指定开启组。
Intent intent = new Intent();
intent.setClassName(this,"cn.ldb.xxx.xxxx");
startActivity(intent);

3.ViewPager(视图滑动切换工具)

ViewPager是android扩展包v4包中的类,是Android 3.0后引入的,如果想在低版本下使用,就需要引入v4 兼容包androidx.viewpager.widget.ViewPager

1)ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。
2)ViewPager类需要一个PagerAdapter适配器类给它提供数据。
3)ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。

  1. xml布局
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".NewActivity">

    <androidx.viewpager.widget.ViewPager 
      android:id="@+id/vp_guide"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

</RelativeLayout>
  1. Activity活动类
//新手引导页:三张照片轮播
//大概思路:①将三张照片的id存放在数组mImageIds中
//         ②根据id,初始化照片
//         ③将imageview存放在数组mimageViews中
//         ④创建Adapter (适配器)
//         ⑤设置适配器GuideAdapter,将我们的view和ViewPager进行绑定
public class NewActivity extends Activity {

    private ViewPager mViewPager;
    
    //图片id集合
    private int[] mImageIds = new int[]{R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3};    

    List<ImageView> mimageViews = new ArrayList<>();       //存放视图的数组

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);     //去掉标题栏
        setContentView(R.layout.activity_new);
        initViews();
        initData();
    }

    //初始化布局
    private void initViews(){
        mViewPager = (ViewPager) findViewById(R.id.vp_guide);    // 实例化viewpager控件
    }

    //初始化数据
    private void initData(){
        for(int i=0;i<mImageIds.length;i++){           //初始化三张图片的imageview
            ImageView view = new ImageView(this);      
            view.setBackgroundResource(mImageIds[i]);
            mimageViews.add(view);                    //将要显示的布局存放到list数组
        }
        mViewPager.setAdapter(new GuideAdapter());    //设置适配器 
    }


    //创建适配器
    class GuideAdapter extends PagerAdapter {
    
        //获得viewpager中有多少个view
        @Override
        public int getCount() {
            return mImageIds.length;
        }

        //第一:将当前视图添加到container中,第二:返回当前View
        public Object instantiateItem(ViewGroup container,int position){
            ImageView view = mimageViews.get(position);
            container.addView(view);
            return view;
        }

        //判断instantiateItem函数返回的Key与一个页面视图是否相等
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view == object;
        }

        //销毁视图,从当前container中删除指定位置(position)的View;
        public void destroyItem(ViewGroup container,int position,Object object){
            container.removeView(mimageViews.get(position));
        }
    }
}

注:setBackgroundResource(int resid)设置一个view的背景图片,只不过传入的是一个drawable的id值或者color颜色值

新手引导图

4.Android动画- - -Animation

Animation类是所有动画(scale、alpha、translate、rotate)的基类

(1)APP中常用的视图动画有:(类相对应的xml标签)
👉透明动画(AlphaAnimation) - - - alpha 渐变透明度动画效果
👉旋转动画(RotateAnimation) - - - scale 渐变尺寸伸缩动画效果
👉移动动画(TranslateAnimation) - - - translate 画面转换位置移动动画效果
👉缩放动画(ScaleAnimation) - - - rotate 画面转移旋转动画效果
❗️注:用AnimationSet就可以把这些动画组合起来实现我们想要的效果

(2)一般来说,Android实现动画组合有四种方式,分别是:
① AnimationSet
② AnimatorSet
③ PropertyValuesHolder
④ ViewPropertyAnimator

Animation常用函数:

函数说明
addAnimation添加定义好的动画效果
setDuration设置播放时长(毫秒)
setRepeatCount设置重放次数
setRepeatMode设置重放模式,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
setInterpolator设置插值器,其实就是指定的动作效果,比如弹跳效果等
setFillAfter是否保持动画完成后的位置 ‍
setFillBefore是否保持动画开始时的状态 ‍
cancel取消AnimationSet
reset释放AnimationSet

插值器Interpolator对应的类及意义:

意义
AccelerateDecelerateInterpolator在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator开始的时候向后然后向前甩
AnticipateOvershootInterpolator开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator动画结束的时候弹起
CycleInterpolator动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator在动画开始的地方快然后慢
LinearInterpolator以常量速率改变
OvershootInterpolator向前甩一定值后再回到原来位置

插值器对应的类及XML属性如下表所示:

对应的XML属性值
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator
AccelerateInterpolator@android:anim/accelerate_interpolator
AnticipateInterpolator@android:anim/anticipate_interpolator
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator
BounceInterpolator@android:anim/bounce_interpolator
CycleInterpolator@android:anim/cycle_interpolator
DecelerateInterpolator@android:anim/decelerate_interpolator
LinearInterpolator@android:anim/linear_interpolator
OvershootInterpolator@android:anim/overshoot_interpolator

4.1四种视图动画

  • 4.2.1 缩放动画 - - - Scale
属性说明
android:fromXScale起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;
android:toXScale结尾的X方向上相对自身的缩放比例,浮点值;
android:fromYScale起始的Y方向上相对自身的缩放比例,浮点值,
android:toYScale结尾的Y方向上相对自身的缩放比例,浮点值;
android:pivotX缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。
android:pivotY缩放起点Y轴坐标,取值及意义跟android:pivotX一样。
  • 4.2.2 旋转动画 - - - Rotate
属性说明
android:fromDegrees开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:toDegrees结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:pivotX缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
android:pivotY缩放起点Y轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
  • 4.2.3 移动动画 - - - Translate
属性说明
android:fromXDelta起始点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,具体意义已在scale标签中讲述,这里就不再重讲
android:fromYDelta起始点Y轴从标,可以是数值、百分数、百分数p 三种样式;
android:toXDelta结束点X轴坐标
android:toYDelta结束点Y轴坐标
  • 4.2.4 透明动画 - - - Alpha
属性说明
android:fromAlpha动画开始的透明度,从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
android:toAlpha动画结束时的透明度,也是从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明

4.2. 组合动画- - -AnimationSet
AnimationSet(boolean shareInterpolator)
⭕️shareInterpolator取值true或false
👉取true时,指在AnimationSet中定义一个插值器(interpolater),它下面的所有动画共同
👉如果设为false,则表示它下面的动画自己定义各自的插值器。

1)在xml文件中设置一个背景图片
2)Activity活动类

public class MainActivity extends Activity {

    private RelativeLayout rlroot;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rlroot = (RelativeLayout) findViewById(R.id.rl_root);

        //旋转
        RotateAnimation animRotate = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  //基于自身旋转360度
        animRotate.setDuration(1000);        //动画时间
        animRotate.setFillAfter(true);

        //缩放
        //pivotXType,它的取值有三个:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;
        ScaleAnimation animScale = new ScaleAnimation(0, 1, 0, 1,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        animScale.setDuration(1000);
        animScale.setFillAfter(true);

        //渐变
        AlphaAnimation animaAlpha = new AlphaAnimation(0, 1);
        animaAlpha.setDuration(2000);
        animaAlpha.setFillAfter(true);

        //动画集合
        AnimationSet set = new AnimationSet(false);
        set.addAnimation(animaAlpha);
        set.addAnimation(animRotate);
        set.addAnimation(animScale);

        //开始动画
        rlroot.startAnimation(set);
    }
}

闪屏

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值