Android学习布局与动画(Day02)

1.LinearLayout布局控件(线性布局)

  • orientation:布局中组件的排列方式。
  • gravity:控制组件所包含的子元素的对齐方式,可多个组合
  • layout_gravity:控制该组件在父容器里的对齐方式。
  • background:为该组件设置一个背景图片,或者是直接用颜色覆盖
  • divider:分割线
  • showDividers:设置分割线所在的位置,none(无),beginning(开始),end(结束),middle(每两个组件之间) 分割线为图片文件,需要事先准备好。
  • dividerPadding 设置分割线的padding
  • layout_weight(权重):该属性是用来等比例的划分区域
<?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:divider="@mipmap/ic_launcher"
    android:showDividers="middle"
    android:dividerPadding="10dp"
    android:gravity="center"
    android:padding="10dp"
    android:orientation="vertical">

    <LinearLayout
        android:layout_gravity="center"
        android:background="#00ff00"
        android:layout_width="100dp"
        android:layout_height="100dp"/>
    <LinearLayout
        android:background="#ff00ff"
        android:layout_width="100dp"
        android:layout_height="100dp"/>
    <LinearLayout
        android:background="#ff0000"
        android:layout_width="100dp"
        android:layout_height="100dp"/>



</LinearLayout>

2.RelativeLayout布局控件(相对布局)

  • 根据父容器定位
    • layout_alignParentLeft:左对齐
    • layout_alignParentRight:右对齐
    • layout_alignParentTop:顶部对齐
    • layout_alignParentBotton:底部对齐
    • layout_centerHorizontal:水平居中
    • layout_centerVertical:垂直居中
    • layout_centerInParent:中间位位置
  • 根据兄弟组件定位
    • layout_toLeftOf:放置于参考组件的左边
    • layout_toRightOf:放置于参考组件的右边
    • layout_above:放置于参考组件的上方
    • layout_below:放置于参考组件的下方
    • layout_alignTop:放置于参考组件的上边界
    • layout_alignBottom:对齐参考组件的上边界
    • layout_alignLeft:对齐参考组件的左边界
    • layout_alignRight:对齐参考组件的右边界
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="100dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
    
    <RelativeLayout
        android:id="@+id/rl_1"
        android:background="#00ff00"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    <RelativeLayout
        android:layout_below="@+id/rl_1"
        android:layout_marginLeft="100dp"
        android:background="#00ffff"
        android:layout_width="100dp"
        android:layout_height="100dp"/>
    
</RelativeLayout>

 

3.FrameLayout控件布局(帧布局) 

  • foreground:设置前景
  • foregroundGravity:设置前景位置
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <FrameLayout
        android:background="#00ff00"
        android:layout_width="400dp"
        android:layout_height="400dp"/>
    <FrameLayout
        android:background="#00ffff"
        android:foreground="@mipmap/ic_launcher"
        android:foregroundGravity="right|bottom"
        android:layout_width="200dp"
        android:layout_height="200dp"/>
    <FrameLayout
        android:background="#ffff00"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    
</FrameLayout>

 4.TableLayout布局控件(表格布局)

  • collapseColumns:设置需要被隐藏的列的序号:从0开始
  • stretchColumns:设置允许被拉伸的列的序号:从0开始
  • shrinkColumns:设置允许被收缩的列的序号:从0开始

子控件设置属性

  • layout_column:显示在第几列
  • layout_span:横向跨几列
<?xml version="1.0" encoding="utf-8"?>
<TableLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:collapseColumns="1"
    android:stretchColumns="2,4"
    android:shrinkColumns="0"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TableRow>
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮1"/>
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="2"
            android:text="按钮2"/>
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="2"
            android:text="按钮3"/>
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮4"/>
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮5"/>
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮5"/>

    </TableRow>
</TableLayout>

5.GridLayout布局控件(网格布局)

  • orientation:设置水平显示还是垂直显示
  • columnCount:设置行的显示个数
  • rowCount:设置列的显示个数

子控件属性

  • layout_column:显示在第几列
  • layout_columnSpan:横向跨几列
  • layout_columnWeight:横向剩余空间分配方式
  • layout_gravity:在网格中的显示位置
  • layout_row:显示在第几行
  • layout_rowSpan:纵向跨几行
  • layout_rowWeight:纵向剩余空间分配
<?xml version="1.0" encoding="utf-8"?>
<GridLayout android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:columnCount="2"
    android:layout_rowWeight="2"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        
        android:text="第一个"/>

    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一个"/>

    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnSpan="2"
        android:layout_columnWeight="1"
        android:layout_gravity="center_vertical"
        android:text="第一个"/>


</GridLayout>

 6.ConsraintLayout布局控件(约束布局)

        该布局与C#windows窗体应用相似,能够直接拖入控件,通过给控件添加约束来实现布局。

7.ListView控件

  • 编写listview所在的layout 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>
  • 编写item所在的layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/tv"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
  • 编写mainActivity类中的逻辑
package com.tian.layoutlearn;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    List<Bean> data = new ArrayList<>();

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

        for (int i = 0;i<100;i++){
            Bean bean = new Bean();
            bean.setName("快乐+"+i);
            data.add(bean);
        }
        //找到lv控件
        ListView listView = findViewById(R.id.lv);
        listView.setAdapter(new MyAdapter(data,this));
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            }
        });
    }
}
  • 创建自己的listview的适配器
package com.tian.layoutlearn;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

public class MyAdapter extends BaseAdapter {

    private List<Bean> data;
    private Context context;

    public MyAdapter(List<Bean> data, Context context) {
        this.data = data;
        this.context = context;
    }

    //一共有多少个数据
    @Override
    public int getCount() {
        return data.size();
    }


    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    //返回每个item条目
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView==null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.list_view_item_layout, parent, false);
            viewHolder.textView = convertView.findViewById(R.id.tv);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.textView.setText(data.get(position).getName());

        return convertView;
    }

    private final class ViewHolder{
        TextView textView;
    }
}
  • 创建Bean
package com.tian.layoutlearn;

public class Bean {
    String name;

    public Bean() {
    }

    public Bean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

8.RecyclerView控件

        该控件为listview的加强自定义版,需要导入依赖       

implementation 'androidx.recyclerview:recyclerview:1.1.0'

  • 创建layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
  • 创建item_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/tv"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
  • 完成自定义Adapter
package com.tian.layoutlearn;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class ReMyAdapter extends RecyclerView.Adapter<ReMyAdapter.MyViewHolder> {
    private List<Bean> data;
    private Context context;

    public ReMyAdapter(List<Bean> data, Context context) {
        this.data = data;
        this.context = context;
    }

    //初始化Holder
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = View.inflate(context,R.layout.list_view_item_layout,null);
        return new MyViewHolder(view);
    }

    //绑定数据
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.tv.setText(data.get(position).getName());
    }

    //显示有多少个数据
    @Override
    public int getItemCount() {
        if (data==null){
            return 0;
        }
        return data.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView tv;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.tv);
        }
    }
}
  • 实现Bean
package com.tian.layoutlearn;

public class Bean {
    String name;

    public Bean() {
    }

    public Bean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 完成MainActivity逻辑
package com.tian.layoutlearn;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    List<Bean> data = new ArrayList<>();

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

        for (int i = 0;i<100;i++){
            Bean bean = new Bean();
            bean.setName("快乐+"+i);
            data.add(bean);
        }

        RecyclerView recyclerView = findViewById(R.id.rv);
        ReMyAdapter reMyAdapter = new ReMyAdapter(data, this);
        recyclerView.setAdapter(reMyAdapter);
        //线性布局
//        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //网格布局
//        GridLayoutManager layoutManager = new GridLayoutManager(this, 3);
        //瀑布流布局
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);


        recyclerView.setLayoutManager(layoutManager);


        //找到lv控件
//        ListView listView = findViewById(R.id.lv);
//        listView.setAdapter(new MyAdapter(data,this));
//        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//            @Override
//            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//
//            }
//        });
    }
}

9.帧动画(逐帧动画)

        将多张图片进行快速的播放

  • 创建animation-list
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/suzumori_park_00111" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00113" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00115" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00117" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00119" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00121" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00123" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00125" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00127" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00129" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00131" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00133" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00135" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00137" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00139" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00141" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00143" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00145" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00147" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00149" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00151" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00153" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00155" android:duration="100"/>
    <item android:drawable="@drawable/suzumori_park_00157" android:duration="100"/>

</animation-list>
  • 创建layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rl"
    android:background="@drawable/suzumori"
    xmlns:android="http://schemas.android.com/apk/res/android">

</RelativeLayout>
  • 实现MainActivity中逻辑
package com.tian.animationlearn;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    private boolean flag = true;

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

        RelativeLayout relativeLayout = findViewById(R.id.rl);
        AnimationDrawable animationDrawable = (AnimationDrawable) relativeLayout.getBackground();
        relativeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flag){
                    animationDrawable.start();
                    flag = false;
                }else {
                    animationDrawable.stop();
                    flag =true;
                }
            }
        });
    }
}
  • 实现图片

 10.补间动画

  • alpha 透明度
    • fromAlpha 设置初始透明度
    • toAlpha 设置最终达到的透明度
    • duration 设置动画完成时间
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="2000"/>
</set>
  • rotate 旋转
    • fromDegrees 设置初始旋转角度
    • toDegrees 设置最终达到的旋转角度
    • pivotx 设置旋转轴x坐标
    • pivoty 设置旋转轴y坐标
    • duration 设置动画完成时间
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="2000"/>
</set>
  • scale 缩放
    • fromXScale设置图片初始X大小
    • fromYScale设置图片初始Y大小
    • toXScale设图片最终缩放X大小
    • toYScale设置图片最终缩放Y大小
    • pivotX 设置图片缩放中心轴X坐标
    • pivotY设置图片缩放中心轴Y坐标
    • duration设置图片动画完成时间
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale 
        android:fromXScale="1" 
        android:fromYScale="1" 
        android:toXScale="0.5" 
        android:toYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%" 
        android:duration="2000"/>
</set>
  • translate 平移
    • duration 设置动画完成时间
    • fromXDelta设置图片初始x偏移
    • fromYDelta设置图片初始y偏移
    • toXDelta设置图片最终X偏移
    • toYDelta设置图片最终Y偏移
<?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="400"
        android:toYDelta="400"/>

</set>

公用代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:maxWidth="300dp"
        android:maxHeight="300dp"
        android:adjustViewBounds="true"
        android:src="@drawable/suzumori_park_00125"/>

</RelativeLayout>
 ImageView imageView = findViewById(R.id.iv);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过加载xml动画设置文件来创建一个animation对象
                Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
                imageView.startAnimation(animation);
            }
        });

11.属性动画

  • 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("tianlog","value:"+value);
            }
        });
        valueAnimator.start();

E/tianlog: value:0.073679864
E/tianlog: value:0.09595364
E/tianlog: value:0.10348278
E/tianlog: value:0.12860283
E/tianlog: value:0.13767341
E/tianlog: value:0.15601262
E/tianlog: value:0.16582394
E/tianlog: value:0.17527595
E/tianlog: value:0.18554324
E/tianlog: value:0.19603491
E/tianlog: value:0.20610732
E/tianlog: value:0.21701273
E/tianlog: value:0.22811979
E/tianlog: value:0.23875079
E/tianlog: value:0.2502268
E/tianlog: value:0.2618809
E/tianlog: value:0.27300477
E/tianlog: value:0.28498077
E/tianlog: value:0.29711008
E/tianlog: value:0.3086583
E/tianlog: value:0.32106042
E/tianlog: value:0.33359015
E/tianlog: value:0.34623873
E/tianlog: value:0.3582433
E/tianlog: value:0.37109637
E/tianlog: value:0.38404122
E/tianlog: value:0.39630032
E/tianlog: value:0.40939718
E/tianlog: value:0.4225586
E/tianlog: value:0.43499652
E/tianlog: value:0.44825655
E/tianlog: value:0.46155345
E/tianlog: value:0.47409347
E/tianlog: value:0.5133501
E/tianlog: value:0.5133501
E/tianlog: value:0.5266908
E/tianlog: value:0.5392295
E/tianlog: value:0.5525245
E/tianlog: value:0.56578225
E/tianlog: value:0.57821715
E/tianlog: value:0.59137523
E/tianlog: value:0.6044678
E/tianlog: value:0.61748624
E/tianlog: value:0.6296624
E/tianlog: value:0.64250964
E/tianlog: value:0.65525526
E/tianlog: value:0.6671502
E/tianlog: value:0.67967266
E/tianlog: value:0.692067
E/tianlog: value:0.70360744
E/tianlog: value:0.715728
E/tianlog: value:0.72769487
E/tianlog: value:0.73880935
E/tianlog: value:0.75045335
E/tianlog: value:0.76191854
E/tianlog: value:0.77253914
E/tianlog: value:0.78363436
E/tianlog: value:0.79452765
E/tianlog: value:0.80458844
E/tianlog: value:0.81506693
E/tianlog: value:0.82532084
E/tianlog: value:0.83475983
E/tianlog: value:0.8445569
E/tianlog: value:0.8541083
E/tianlog: value:0.86286736
E/tianlog: value:0.8719225
E/tianlog: value:0.8807126
E/tianlog: value:0.8887377
E/tianlog: value:0.89699525
E/tianlog: value:0.9049696
E/tianlog: value:0.91221136
E/tianlog: value:0.91962016
E/tianlog: value:0.9267299
E/tianlog: value:0.93314356
E/tianlog: value:0.93965816
E/tianlog: value:0.94585925
E/tianlog: value:0.9514053
E/tianlog: value:0.9569855
E/tianlog: value:0.96223974
E/tianlog: value:0.96688396
E/tianlog: value:0.9714953
E/tianlog: value:0.9757704
E/tianlog: value:0.97948414
E/tianlog: value:0.98309815
E/tianlog: value:0.9863677
E/tianlog: value:0.9891282
E/tianlog: value:0.9917226
E/tianlog: value:0.99396646
E/tianlog: value:0.9957565
E/tianlog: value:0.9973154
E/tianlog: value:0.99851966
E/tianlog: value:0.9993284
E/tianlog: value:0.9998421
E/tianlog: value:1.0 

  • ObjectAnimator
ImageView imageView = findViewById(R.id.iv);

        //让透明度从完全透明到不透明
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView,"alpha",0f,1f);
        objectAnimator.setDuration(4000);
        objectAnimator.start();

主要是看View控件中有那些属性,有get和set方法的都能够使用。

设置监听

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) {

            }
        });
        
        //能够让我们只选择一个方法实现
        objectAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                super.onAnimationStart(animation);
            }
        });
        objectAnimator.start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Devotes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值