MainActivity.java
package com.lyw.myproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.CountDownTimer;
import com.lyw.myproject.been.BusLineBeen;
import com.lyw.myproject.widget.BusLineView;
import java.util.ArrayList;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
private MyCountDown myCountDown;
private BusLineView busline;
private ArrayList<BusLineBeen> mBusLineViewBeen;
private int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initData();
initView();
initEvent();
}
private void initEvent() {
myCountDown = new MyCountDown(8000*10,4000);
myCountDown.start();
}
private void initData() {
mBusLineViewBeen = new ArrayList<>();
mBusLineViewBeen.add(new BusLineBeen("12:20","北京站"));
mBusLineViewBeen.add(new BusLineBeen("13:20","上海站"));
mBusLineViewBeen.add(new BusLineBeen("14:20","广州站"));
mBusLineViewBeen.add(new BusLineBeen("15:20","天津站"));
mBusLineViewBeen.add(new BusLineBeen("16:20","桂林站"));
mBusLineViewBeen.add(new BusLineBeen("17:20","深圳站"));
}
private void initView() {
busline = (BusLineView)findViewById(R.id.busline_bv);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (myCountDown != null) {
myCountDown.cancel();
}
}
class MyCountDown extends CountDownTimer {
public MyCountDown(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long l) {
if (index < mBusLineViewBeen.size()){
for(int i = 0;i < mBusLineViewBeen.size();i++){
if (index == i) {
mBusLineViewBeen.get(i).setCurBusStop(true);
}else {
mBusLineViewBeen.get(i).setCurBusStop(false);
}
}
busline.setBusDataList(mBusLineViewBeen);
}
index ++;
}
@Override
public void onFinish() {
}
}
}
BusLineView.java
package com.lyw.myproject.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.View;
import com.lyw.myproject.R;
import com.lyw.myproject.been.BusLineBeen;
import java.util.ArrayList;
public class BusLineView extends View {
private Paint mLine;
private ArrayList<BusLineBeen> mBusLineViewBeen;
private Paint mBitmapPaint;
private Bitmap bitmap ,upBitmap;
private int mBusBitWidth,mBusBitHeight;
private Rect mSrcRect;
private RectF mDestRect;
private Context mcontext;
public BusLineView(Context context) {
super(context);
}
public BusLineView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mcontext = context;
mBusLineViewBeen = new ArrayList<>();
initBitmap();
initBitmapPaint();
}
private void initBitmapPaint() {
mBitmapPaint = new Paint();
}
private void initBitmap() {
bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.gongjiaoche)).getBitmap();
upBitmap = upImageSize(mcontext,bitmap, 30, 30);
mBusBitWidth = upBitmap.getWidth();
mBusBitHeight = upBitmap.getWidth();
}
public BusLineView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mLine = new Paint();
mLine.setColor(Color.RED);
mLine.setAntiAlias(true);
mLine.setStrokeWidth(8);
mLine.setStyle(Paint.Style.STROKE);
//路线颜色数组
int [] colorArry = {Color.RED,Color.GREEN,Color.YELLOW,Color.BLUE,Color.BLACK,Color.CYAN,Color.WHITE};
float circlePointDistance = 0;//圆心之间的距离
float initLength = 20;//进度条基本长度
float mProgressCenterX = 50;//进度条x坐标
float mProgressCenterY = 20;//进度条y坐标
float baseInterval = 100;//基本长度
float circlePointY = 0;//圆心y坐标
float radius = 20;//圆半径
if (mBusLineViewBeen == null || mBusLineViewBeen.size() <= 0) {
return;
}
for(int i = 0;i < mBusLineViewBeen.size();i++){
BusLineBeen busLineBeen = mBusLineViewBeen.get(i);
if (busLineBeen == null) {
break;
}
//画线
if (i>0) {
Path path = new Path();
//绘制不同颜色
if (i < colorArry.length){
mLine.setColor(colorArry[i-1]);
}
path.moveTo(mProgressCenterX,circlePointY+radius);
path.lineTo(mProgressCenterX,initLength + mProgressCenterY + circlePointDistance-radius);
canvas.drawPath(path,mLine);
}
//画圆
Paint mPainCircle = new Paint();
mPainCircle.setStyle(Paint.Style.STROKE);
mPainCircle.setStrokeWidth(5);
if (busLineBeen.isCurBusStop()) {
mPainCircle.setColor(Color.RED);
}else {
mPainCircle.setColor(Color.BLACK);
}
circlePointY = initLength + mProgressCenterY + circlePointDistance;
canvas.drawCircle(mProgressCenterX,circlePointY ,radius,mPainCircle);
//画文字
String text = busLineBeen.getBusTime()+" "+ busLineBeen.getBusStaName();
float textdx = 80;
Paint mPainText = new Paint();
mPainText.setTextSize(30);
if (busLineBeen.isCurBusStop()) {
mPainText.setColor(Color.RED);
}else {
mPainText.setColor(Color.BLACK);
}
Paint.FontMetrics fontMetrics = mPainText.getFontMetrics();
float dy = (fontMetrics.descent - fontMetrics.ascent) / 2 - fontMetrics.descent;
canvas.drawText(text,mProgressCenterX+textdx,circlePointY+dy,mPainText);
circlePointDistance += baseInterval+ radius;
if (busLineBeen.isCurBusStop()) {
//画图片
mSrcRect = new Rect(0, 0, mBusBitWidth, mBusBitHeight);//图片的大小
float left = mProgressCenterX - mBusBitWidth/2;
float top = circlePointY - mBusBitHeight/2;
float right = mProgressCenterX + mBusBitWidth/2;
float bottom = circlePointY + mBusBitHeight/2;
mDestRect = new RectF(left, top, right, bottom);//图片的位置
canvas.drawBitmap(upBitmap,mSrcRect,mDestRect,mBitmapPaint);
}
}
}
/**
* 设置数据
* @param beens
*/
public void setBusData(BusLineBeen beens){
if (beens !=null) {
mBusLineViewBeen.add(beens);
}
invalidate();
}
/**
* 设置数据
* @param beensList
*/
public void setBusDataList(ArrayList<BusLineBeen> beensList){
if (beensList !=null && beensList.size()>0) {
mBusLineViewBeen = beensList;
}
invalidate();
}
/**
* 相片按相框的比例动态缩放
* @param context
* @param
* @param width 模板宽度
* @param height 模板高度
* @return
*/
public static Bitmap upImageSize(Context context,Bitmap bmp, int width,int height) {
if(bmp==null){
return null;
}
// 计算比例
float scaleX = (float)width / bmp.getWidth();// 宽的比例
float scaleY = (float)height / bmp.getHeight();// 高的比例
//新的宽高
int newW = 0;
int newH = 0;
if(scaleX > scaleY){
newW = (int) (bmp.getWidth() * scaleX);
newH = (int) (bmp.getHeight() * scaleX);
}else if(scaleX <= scaleY){
newW = (int) (bmp.getWidth() * scaleY);
newH = (int) (bmp.getHeight() * scaleY);
}
return Bitmap.createScaledBitmap(bmp, newW, newH, true);
}
}
activity_main.xml
<?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">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/coutomview"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎乘坐168路公交车"
android:clickable="true" />
<com.lyw.myproject.widget.BusLineView
android:id="@+id/busline_bv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>