今天来分享一下时间轴,最近看很多App里面都很常见,水平一般,所以仿了一个。
先上张图片:
代码:
MainActivity:
public class MainActivity extends AppCompatActivity {
private MyView myView;
private View activity_main;
private View top;
private View bottom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//通过LayoutInflater动态加载布局,主要取到activity_main,这个布局,然后通过setContentView进行设置,为什么不直接设置setContentView(R.layout.activity_main);
//因为在onResume之前都无法得到View测量的结果,width和heigh都是0,所以通过addOnGlobalLayoutListener进行回掉(当onMeasure,onLayot执行完毕会回掉,才能拿到宽高)
LayoutInflater layoutInflater = LayoutInflater.from(this);
activity_main = layoutInflater.inflate(R.layout.activity_main, null);
//得到自定义View
myView = (MyView) activity_main.findViewById(R.id.myView);
//分别得到两段文字的TextView
top = activity_main.findViewById(R.id.top);
bottom = activity_main.findViewById(R.id.bottom);
setContentView(activity_main);
}
@Override
protected void onStart() {
super.onStart();
//activity_main布局全部构建完毕会回调
ViewTreeObserver Observer = activity_main.getViewTreeObserver();
Observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//移除监听
activity_main.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//设置文本
myView.setText(new String[]{
"下","中","上"});
//分别设置两段文字的高
myView.setViewHeight(new int[]{bottom.getTop(),top.getTop()+200,top.getTop()});
//强制View重绘
myView.mInvalidate();
myView.setRadius(36);
}
});
}
}
自定义View:
public class MyView extends View {
//绘制圆的半径
private int radius;
//每段文字的高(决定着小球的高)
private int[] viewHeight;
//小圆球上面的文本
private String[] text;
private Paint p;
private Rect mBounds;
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
//初始化画笔
p = new Paint();
p.setColor(Color.RED);
p.setAntiAlias(true);
mBounds = new Rect();
}
@Override
protected void onMeasure(