公交车到站提示功能(简单自定义View)

在这里插入图片描述
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>

猜你喜欢

转载自blog.csdn.net/qq_28002747/article/details/105244303