我想在Android上構建一個工具,用戶可以在畫面上繪製一些簡單的對象(例如線,圓或箭頭)。我開始嘗試線條部分,並且確實可以成功繪畫。邏輯是,用戶點擊一點,然後拖動他們的手指,畫線。我用這樣一個類(它是基於DonGru's answer here):Android - 用戶用他們的手指畫線
public class DrawView extends View {
Paint paint = new Paint();
float Sx, Sy, Lx, Ly;
public DrawView(Context context, float x1, float y1, float x2, float y2) {
super(context);
paint.setColor(Color.RED);
Sx=x1;
Sy=y1;
Lx=x2;
Ly=y2;
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawLine(Sx, Sy, Lx, Ly, paint);
}
}
從活動代碼我使用onTouch監聽器是這樣的:
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Sx1 = event.getX();
Sy1 = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
Cx1 = event.getX();
Cy1 = event.getY();
drawLine();
return true;
case MotionEvent.ACTION_UP:
Lx1 = event.getX();
Ly1 = event.getY();
return true;
}
return false;
}
public void drawLine(){
setContentView(R.layout.show);
ImageView myImage = (ImageView) findViewById(R.id.lastphoto);
myImage.setImageBitmap(rotatedPic);
dv=new DrawView(this, Sx1, Sy1, Cx1, Cy1);
addContentView(dv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT));
RelativeLayout mRelativeLayout = (RelativeLayout) findViewById(R.id.linear);
mRelativeLayout.setOnTouchListener((OnTouchListener) this);
mRelativeLayout.addView(new Drawer(this));
}
上的一舉一動我重新創建整個視圖,因此從開始到結束點只有一行是可見的。我首先關心的是我不知道這個實現是否正確。另外,我希望將這些行作爲創建後的對象進行處理。用戶應該能夠移動它們,旋轉它們,刪除等等。我認爲我可以通過將每行邊緣的座標保存爲緩衝區等方式來實現這一點,並且如果用戶點擊的距離非常接近邊緣,我可以處理那個手勢。但所有這些聽起來都太複雜了,我不知道這是不是很不穩定。
是否有一些不同的方法,我應該用來實現這樣的東西,我完全失蹤?
你的實現很奇怪。爲了實現這樣一個程序,你需要一個'View',重寫它的'onDraw'方法,處理用戶的拖動動作,並相應地調用View.invalidate()。 – neevek
你的意思是創建一個擴展視圖的對象?像DrawView一樣,我將它作爲繪製的類來使用?但在這個對象的實例上調用invalidate不會擦除前面的行。你有一個例子的鏈接,以便我能理解你的意思嗎? – george