2012-06-08 19 views
1

我尝试加载我的mainclass中的xml中的customview类。因为要保存图像在视图中我在xml中创建按钮,我需要加载这些customview在我的xml的framelayout。通过启动这些我只是把线性布局视图类,这导致forceclose :(在Xml的mainclass中加载CustomView类

我MainClass.java

public class FingerPaint extends Activity 
    implements ColorPickerDialog.OnColorChangedListener {  
int height,width; 
@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Display display = getWindowManager().getDefaultDisplay(); 
    width = display.getWidth(); // deprecated 
    height = display.getHeight(); 
    Log.i("FingerPaint", ""+width+""+height); 
    //setContentView(new MyView(this));--->It Works fine. But need these in xml 
    setContentView(R.layout.paint); 

    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(0xFFFF0000); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(12); 

    mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
            0.4f, 6, 3.5f); 

    mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 
} 

private Paint  mPaint; 
private MaskFilter mEmboss; 
private MaskFilter mBlur; 

public void colorChanged(int color) { 
    mPaint.setColor(color); 
} 

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); 
     Bitmap bm = BitmapFactory.decodeFile("/sdcard/angel.jpg"); 
     if (bm != null) { 
      setBackgroundDrawable(new BitmapDrawable(bm)); 
      Log.i("FingerPaint", "setbackground"+bm.getHeight()); 
     } 
     mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 

     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 

     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    public MyView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

    } 


    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // canvas.drawColor(0xFFAAAAAA); 

     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(); 
       invalidate(); 
       break; 
     } 
     return true; 
    } 
} 

private static final int COLOR_MENU_ID = Menu.FIRST; 
private static final int EMBOSS_MENU_ID = Menu.FIRST + 1; 
private static final int BLUR_MENU_ID = Menu.FIRST + 2; 
private static final int ERASE_MENU_ID = Menu.FIRST + 3; 
private static final int SRCATOP_MENU_ID = Menu.FIRST + 4; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 

    menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c'); 
    menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's'); 
    menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z'); 
    menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z'); 
    menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z'); 

    /**** Is this the mechanism to extend with filter effects? 
    Intent intent = new Intent(null, getIntent().getData()); 
    intent.addCategory(Intent.CATEGORY_ALTERNATIVE); 
    menu.addIntentOptions(
          Menu.ALTERNATIVE, 0, 
          new ComponentName(this, NotesList.class), 
          null, intent, 0, null); 
    *****/ 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    mPaint.setXfermode(null); 
    mPaint.setAlpha(0xFF); 

    switch (item.getItemId()) { 
     case COLOR_MENU_ID: 
      new ColorPickerDialog(this, this, mPaint.getColor()).show(); 
      return true; 
     case EMBOSS_MENU_ID: 
      if (mPaint.getMaskFilter() != mEmboss) { 
       mPaint.setMaskFilter(mEmboss); 
      } else { 
       mPaint.setMaskFilter(null); 
      } 
      return true; 
     case BLUR_MENU_ID: 
      if (mPaint.getMaskFilter() != mBlur) { 
       mPaint.setMaskFilter(mBlur); 
      } else { 
       mPaint.setMaskFilter(null); 
      } 
      return true; 
     case ERASE_MENU_ID: 
      mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
      /*//mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); 
      mPaint.setColor(Color.TRANSPARENT);*/ 
      return true; 
     case SRCATOP_MENU_ID: 
      mPaint.setXfermode(new PorterDuffXfermode(
               PorterDuff.Mode.SRC_ATOP)); 
      mPaint.setAlpha(0x80); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

而且paint.xml如,

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <com.powercamerapro.FingerPaint.MyView android:id="@+id/myView1" 
    android:layout_width="wrap_content" android:layout_height="wrap_content"> 
    </com.powercamerapro.FingerPaint.MyView> 
    </LinearLayout> 

它抛出异常,

ERROR/AndroidRuntime(670): Caused by: java.lang.ClassNotFoundException: com.powercamerapro.FingerPaint.MyView in loader [email protected] 

请指出我的错误以及如何纠正这些错误。

回答

1

使用这样的内部类com.powercamerapro.FingerPaint $ MyView的

,并使用<view class="com.powercamerapro.FingerPaint$MyView" /> +

You need to add public static to the inner class 
+0

http://stackoverflow.com/questions/4483433/error-inflating-inner- class-view –

+0

嗨,谢谢你的回答。但它只是在xml – Shalini

+0

中使用上述代码时将空白页显示在onDraw中,并检查呼叫是否在那里? –