android studio 如何畫線

經過鄙人兩年的大學生活,要畫線的課程設計或實驗遇到過兩次,前些天課程設計選擇的安卓搞界面,遇到過很多困難,還要幾天之內搞定,界面好坑,就想寫一下。

Canvas畫布

必須的,之前我有想過用一個ImageView代替然後給這個控件加一張斜線圖片,最終,浪費了我兩天時間。

這個畫布我不想多說什麼,必須用RelativeLayout佈局!!!!!!!!直接上代碼:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class NewView extends View {

    private float startX;
    private float startY;
    private float stopX;
    private float stopY;

    private float startXX;
    private float startYY;
    private float stopXX;
    private float stopYY;

    private int distance = 0;

    private String connetRouter;
    private String connectNet;

    private Bitmap bitmp ;

    public NewView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NewView(luyouView luyouview, float startX, float startY, float stopX, float stopY) {
        super(luyouview);
        this.startX = startX;
        this.startY = startY;
        this.stopX = stopX;
        this.stopY = stopY;
        bitmp =Bitmap.createBitmap(500,500, Bitmap.Config.ARGB_8888);
    }

    // 當Android系統需要繪製一個View對象時,就會嗲用該對象的onDraw
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.parseColor("#00FFFFFF"));
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        if (startX < stopX) {
            if (startY > stopY){
                canvas.drawLine(0, startY-stopY, stopX-startX,0, paint);
            }
            if (startY < stopY){
                canvas.drawLine(0, 0, stopX - startX,stopY-startY, paint);
            }
        }
        if(startX > stopX) {
            if (startY > stopY) {
                canvas.drawLine(startX - stopX, startY - stopY, 0,0, paint);
            }
            if (startY < stopY) {
                canvas.drawLine(0, stopY - startY, startX - stopX,0, paint);
            }
        }
        super.onDraw(canvas);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //設置寬高
        setMeasuredDimension((int)Math.abs(stopX-startX), (int)Math.abs(stopY-startY));
    }

    public void setStartXX(float startXX) {
        this.startXX = startXX;
    }

    public void setStartYY(float startYY) {
        this.startYY = startYY;
    }

    public void setStopXX(float stopXX) {
        this.stopXX = stopXX;
    }

    public void setStopYY(float stopYY) {
        this.stopYY = stopYY;
    }

    public void setDistance(int distance) {
        this.distance = distance;
    }

    public void setConnetRouter(String connetRouter) {
        this.connetRouter = connetRouter;
    }

    public void setConnectNet(String connectNet) {
        this.connectNet = connectNet;
    }

    public float getStartXX() {
        return startXX;
    }

    public float getStartYY() {
        return startYY;
    }

    public float getStopXX() {
        return stopXX;
    }

    public float getStopYY() {
        return stopYY;
    }

    public int getDistance() {
        return distance;
    }

    public String getConnetRouter() {
        return connetRouter;
    }

    public String getConnectNet() {
        return connectNet;
    }
}

這個類中用來畫線的就只有其中的onDraw函數了,其它的get和set都是我的課程設計需要的東西。這個類的主要作用就是:畫線,並且縮小view至其與線條在xy軸上的投影長寬相等的位置,但是,這個線條畫出來之後,View的位置在左上角。

 

主程序對其的調用:

NewView newView = new NewView(luyouView.this, startX, startY, stopX, stopY);
relativeLayout.addView(newView);

主程序名字是luyouView,替換一下就行了,至於startX等等,就是另一段代碼了,那塊代碼關係甚大,附上去你們肯定運行不了。這裏的startX、startY、stopX、stopY就是畫線的時候監控的手指起點和終點的x、y的座標。最後你們移動一下view就行了。

 

移動View的代碼:

        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) 
        newView.getLayoutParams();
        params.height = newView.getHeight();
        params.width = newView.getWidth();

        if (startX < stopX) {
            if (startY >stopY){
                params.setMargins((int) startX,(int) stopY, (int)stopX, (int) startY);
            }
            if (startY < stopY){
                params.setMargins((int) startX, (int) startY, (int) stopX, (int) stopY);
            }
        }
        if(startX > stopX) {
            if (startY > stopY) {
                params.setMargins((int) stopX, (int) stopY, (int) startX, (int) startY);
            }
            if (startY < stopY) {
                params.setMargins((int) stopX, (int) startY, (int)startX, (int) stopY);
            }
        }
        newView.setLayoutParams(params);
        newView.setId(newViewOnlyId);
        newView.setStartXX(startX);
        newView.setStartYY(startY);
        newView.setStopXX(stopX);
        newView.setStopYY(stopY);
        newViewOnlyId++;
        if (connectInformation.get(0)[2] == 0)
            newView.setConnectNet(listNetButton.get(connectInformation.get(0)[0]).getText().toString());
        if (connectInformation.get(0)[2] == 1)
            newView.setConnetRouter(listRouterButton.get(connectInformation.get(0)[0]).getText().toString());
        if (connectInformation.get(1)[2] == 0)
            newView.setConnectNet(listNetButton.get(connectInformation.get(1)[0]).getText().toString());
        if (connectInformation.get(1)[2] == 1)
            newView.setConnetRouter(listRouterButton.get(connectInformation.get(1)[0]).getText().toString());
        connectInformation = new ArrayList<>();
        for (int i = 0; i < routers.size(); i++) {
            if (routers.get(i).getRouterName().equals(newView.getConnetRouter())){
                ArrayList<String> connectNets = routers.get(i).getConnectNets();
                connectNets.add(newView.getConnectNet());
                routers.get(i).setConnectNets(connectNets);
                setRouters(i);
                break;
            }
        }

        listNewView.add(newView);
        if (((startX > stopX) && (startY > stopY)) || ((startX < stopX) && (startY < stopY))) {
            new PathInfo.Builder(new TopLeftAndButtomRight(), newView)
                    .setApplyFlag(APPLY_FLAG_DRAW_AND_TOUCH)
                    .setClipType(CLIP_TYPE_IN)
                    .create()
                    .apply();
        }else {
            new PathInfo.Builder(new ButtomLeftAndTopRight(), newView)
                    .setApplyFlag(APPLY_FLAG_DRAW_AND_TOUCH)
                    .setClipType(CLIP_TYPE_IN)
                    .create()
                    .apply();
        }
        // setContentView(newView);     //狗屁的setContentView,浪費我這麼多時間

listNewView就是NewView的變長數組,最後的那段if else代碼引用了別人寫的控件切割佈局,鏈接

這作用呢,當然是把長方形的View切割成我想要的形狀。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章