2013-04-09 2 views
0

У меня есть этот код, поэтому я могу рисовать пальцем по определенному изображению. Теперь я хочу добавить макет и некоторые изображения в этом макете. Как я могу это сделать? Поскольку я хочу добавить в макет, некоторые onTouch и onClick Listeners могут перемещать 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; 
    } 
} 

(EDIT) При попытке решения Gunaseelan, я принять это ошибка:

04-09 13: 05: 08,842: D/dalvikvm (852): GC_FOR_ALLOC освободил 50k, 4 % free 9056K/9347K, приостановлено 89ms 04-09 13: 05: 08.892: I/dalvikvm-heap (852): Выращивание кучи (фрагмент фут) до 11.503MB для выделения 2716016 байтов 04-09 13:05: 09.033: 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): FATAL ИСКЛЮЧЕНИЕ: 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): at 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 (родной метод) 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): Caused by: java.lang.IllegalStateException: указанный дочерний объект уже имеет родителя. Вы должны сначала позвонить removeView() в родительский элемент ребенка. 04-09 13: 05: 09.783: E/AndroidRuntime (852): на 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): at 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-04 13: 05: 21.712: I/Process (852): сигнал отправки. PID: 852 SIG: 9

+0

вы можете сделать это как обычно. растяните линейный выход и добавьте к нему свои взгляды. все вещи, которые вы хотите сделать, могут быть реализованы в стандартном макете Android. – Mbt925

ответ

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

+0

Я пробую это сейчас, я помещаю последние строки в контрструктуру Myview, но появляются те же ошибки! Я загружаю снова свои ошибки – user2241299

+0

Да, я так думаю. Но у этого парня есть эта строка setContentView (R.layout.activity_main); , но я использую setContentView (view1); Я думаю, что есть проблема, но без этой строки я не могу рисовать без этого – user2241299

Смежные вопросы