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