2013-04-09 101 views
0

我擁有此代碼,因此我可以用手指在特定圖像上繪製。現在我想在這個佈局中添加一個Layout和一些Imageviews。我如何做到這一點? 因爲我想在Layout中添加一些onTouch和onClick監聽器來移動ImageViews。 另外,我可以添加一個現有的XML佈局,或只是動態地創建新的佈局?在視圖中添加布局

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MyView view1 =new MyView(this); 

    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.BLACK); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(3); 

    setContentView(view1); 
} 

public class MyView extends View { 

    private static final float MINP = 0.25f; 
    private static final float MAXP = 0.75f; 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mBitmapPaint; 

    public MyView(Context c) { 
     super(c); 
     setBackgroundResource(R.drawable.half_court); 
     // this.inflate(c, R.drawable.playera1, null); 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // canvas.drawLine(mX, mY, Mx1, My1, mPaint); 
     // canvas.drawLine(mX, mY, x, y, mPaint); 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 


    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      // mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 
    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       touch_start(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       touch_move(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       touch_up(); 
      // Mx1=(int) event.getX(); 
      // My1= (int) event.getY(); 
       invalidate(); 
       break; 
     } 
     return true; 
    } 
} 

(編輯)當我試圖Gunaseelan的溶液,我藉此錯誤:

04-09 13:05:08.842:d/dalvikvm(852):GC_FOR_ALLOC釋放50K,4 %免費 9056K/9347K,暫停89ms 04-09 13:05:08.892:I/dalvikvm-heap(852): 爲2716016字節的分配增加堆(碎片大小)爲11.503MB 04-09 13:05: D/dalvikvm(852):GC_CONCURRENT已釋放< 1K,3%免費 11708K/12039K,暫停9ms + 19ms 04-09 13:05:09.741: D/AndroidRuntime(852):關閉VM 04-09 13:05:09.751: W/dalvikvm(852):threadid = 1:線程以未捕獲異常退出 (group = 0x409c01f8)04-09 13:05:09.783:E/AndroidRuntime(852):致命 EXCEPTION:main 04-09 13:05:09.783:E/AndroidRuntime(852): java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.mitsos.thebasic/com.mitsos.thebasic.main}: java.lang.IllegalStateException:指定的子項已經有一個 父項。您必須先調用子對象的父對象的removeView()。 04-09 13:05:09.783:E/AndroidRuntime(852):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 04-09 13:05:09.783:E/AndroidRuntime(852): (ActivityThread.java:123) Android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 04-09 13:05:09.783:E/AndroidRuntime(852):at android.app.ActivityThread.access $ 600(ActivityThread.java:123) 04-09 13:05:09.783:E/AndroidRuntime(852):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1147) 04-09 13:05:09.783:E/AndroidRuntime(852) ):at android.os.Handler.dispatchMessage(Handler.java:99)04-09 13:05:09.783:E/AndroidRuntime(852):at android .os.Looper.loop(Looper.java:137)04-09 13:05:09.783: E/AndroidRuntime(852):at android.app.ActivityThread.main(ActivityThread.java:4424)04-09 13:05:09.783:E/AndroidRuntime(852):at java.lang.reflect.Method.invokeNative(Native Method)04-09 13:05:09.783:E/AndroidRuntime(852):at java.lang .reflect.Method.invoke(Method.java:511)04-09 13:05:09.783: E/AndroidRuntime(852):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java: 784) 04-09 13:05:09.783:E/AndroidRuntime(852):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)04-09 13:05:09.783:E/AndroidRuntime(852):at dalvik .system.NativeStart.main(Native Method)04-09 13:05:09.783: E/AndroidRuntime(852):引起:java.lang.IllegalStateException: 指定的子項已經有父項。您必須首先調用 孩子的父母的removeView()。 04-09 13:05:09.783:E/AndroidRuntime(852): at android.view.ViewGroup.addViewInner(ViewGroup.java:3337)04-09 13:05:09.783:E/AndroidRuntime(852):at android.view.ViewGroup.addView(ViewGroup.java:3208)04-09 13:05:09.783:E/AndroidRuntime(852):at android.view.ViewGroup.addView(ViewGroup。java:3188)04-09 13:05:09.783:E/AndroidRuntime(852):at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 04-09 13:05 :09.783:E/AndroidRuntime(852):在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:260) 04-09 13:05:09.783:E/AndroidRuntime(852):at android.app.Activity.setContentView(Activity.java:1855)04-09 13:05:09.783:E/AndroidRuntime(852):at com.mitsos.thebasic.main.onCreate(main.java:53) 04-09 13:05:09.783: E/AndroidRuntime(852):at android.app.Activity.performCreate(Activity.java:4465)04-09 13:05:09.783:E/AndroidRuntime(852):在 androi d.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 04-09 13:05:09.783:E/AndroidRuntime(852):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 04- 09 13:05:09.783:E/AndroidRuntime(852):... 11更多04-09 13:05:21.712:I/Process(852):發送信號。 PID:852 SIG:9

+0

你可以照常進行。擴展一個線性佈局並添加您的視圖。所有你想做的事情,都可以在標準的android佈局中實現。 – Mbt925 2013-04-11 08:06:44

回答

0

嘗試這種方式

LinearLayout layout = new LinearLayout(this); 
ImageView iv = new ImageView(this); 
iv.setImageResource(R.drawable.your_image); 
layout.addView(iv); 
layout.addView(view1); 
setContentView(layout); 

那麼你onCreate()應該

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MyView view1 =new MyView(this); 

    LinearLayout layout = new LinearLayout(this); 
    ImageView iv = new ImageView(this); 
    iv.setImageResource(R.drawable.your_image); 
    layout.addView(iv); 
    layout.addView(view1); 

    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.BLACK); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(3); 

    setContentView(layout); 
} 

我希望這會工作。

+0

不幸的是,當我這樣做時,我的程序因錯誤而關閉。永遠不會運行。你想上傳我的錯誤嗎? – user2241299 2013-04-09 13:00:44

+0

我現在試一試,我把它們放在Myview的contsructor上的最後一行,但是同樣的錯誤出現了! 我再次上傳我的錯誤 – user2241299 2013-04-09 13:18:33

+0

是的,我認爲是。但是這個人有這條線setContentView(R.layout.activity_main); 但我使用setContentView(view1); 我認爲有問題,但沒有這條線我不能沒有這個畫 – user2241299 2013-04-09 13:27:21