Material Desigh是一套UI设计标准。这这套标准中有一个非常重要的概念——Z轴概念,Z轴把以前的2D变成了3D,在UI中的体现就是有阴影。Material Design学习网站,或者这个网站。
AppCompatActivity兼容包,是为了低版本兼容Material Design。
Material Design官网:https://www.mdui.org/design/material-design/introduction.html
Material Design说明简书:https://www.jianshu.com/p/5dfed8a3a017
我们看一下效果,一个控件跟着另一个控件运动。
package com.example.myapplication;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
//TextView是观察者的类型
public class FollowBehavior extends CoordinatorLayout.Behavior<TextView> {
//是否是第一次进入
private boolean isOne = true;
private Context context;
//这个构造方法一定要有
public FollowBehavior(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
this.context = context;
}
/**
* layoutDependsOn():这个方法在对界面进行布局时至少会调用一次,
* 用来确定本次交互行为中的dependent view
* 当dependency的类型匹配的时候返回true,
* 就可以让系统知道布局文件中的匹配的这个类型的控件就是本次交互行为中的dependent view(被观察者)
*/
@Override
public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull TextView child, @NonNull View dependency) {
if(dependency.getId() == R.id.button){
return true;
}else{
return false;
}
}
/**
*
* @param parent
* @param child 观察者
* @param dependency 被观察者
* @return
*/
@Override
public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull TextView child, @NonNull View dependency) {
if(!isOne){//初始化界面是否生效,如果没有这个if语句,第一次进入页面就会生效
child.setX(dependency.getX()+200);
child.setY(dependency.getY()+200);
}
isOne = false;
return true;
}
}
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textview);
btn = findViewById(R.id.button);
btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE){
//注意,这里要去除ActionBar的高度,或者设置主题为NoActionBar
v.setX(event.getRawX()-v.getWidth()/2);
v.setY(event.getRawY() - v.getHeight()/2);
}
return true;
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">
<TextView
app:layout_behavior=".FollowBehavior"
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
<Button
android:id="@+id/button"
android:layout_gravity="center"
android:text="被观察者"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>