經過鄙人兩年的大學生活,要畫線的課程設計或實驗遇到過兩次,前些天課程設計選擇的安卓搞界面,遇到過很多困難,還要幾天之內搞定,界面好坑,就想寫一下。
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切割成我想要的形狀。