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之间的界面跳转
- Intent中文翻译为“意图”,它是Android程序中各个组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
- Intent一般用于启动Activity、启动服务、发送广播等,承担了Android应用程序三大核心组件相互间的通信功能。
- 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);
- 显式意图还可以根据目标组件的包名、全路径名来指定开启组。
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使用。
- 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>
- 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);
}
}
闪屏