2011-05-03 62 views
0

我想獲得一個面板,其中包含一個圖像,我將放置在另一個圖像上,當我觸摸屏幕頂部(覆蓋)圖像將通過PoerterDuffXfermode (PorterDuff.Mode)等,無論如何,我已經完成了功能和粉塵感謝在這個論壇上的人提供了一些代碼基本上完成我所需要的代碼的幫助,但我有一個輕微的問題,球員執行代碼,不會讓我正確地引用面板類XML放置在預先定義的XML(main.xml中)文件中的面板。它給我一個錯誤,說明Android LAYOUT xml/java error

自定義視圖面板不使用2或3參數視圖構造函數; XML屬性將不起作用

這就是我的xml在基本比例上的外觀(只是外部線性佈局中的視圖)。

<com.easyscratch.full.Panel 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id ="@+id/easyCustView" 
    android:layout_width="300dp" 
    android:layout_height="300dp" 
    android:visibility="visible" 
    android:focusableInTouchMode="true"/> 

的Java是爲其次。(Panel類)

package com.easyscratch.full; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Bitmap.Config; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 

class Panel extends View 
{ 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mPaint; 
    Bitmap bitmap; 
    Canvas pcanvas ; 
    int x = 0; 
    int y =0; 
    int r =0; 
    public Panel(Context context) { 
     super(context); 

     Log.v("Panel", ">>>>>>"); 

     setFocusable(true); 
     setBackgroundColor(Color.GREEN); 

     // setting paint 
      mPaint = new Paint(); 
      mPaint.setAlpha(0); 
      mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
      mPaint.setAntiAlias(true); 

      // getting image from resources 
      Resources r = this.getContext().getResources(); 

      Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.foreground_image); 

      // converting image bitmap into mutable bitmap 

       bitmap = Bitmap.createBitmap(295, 260, Config.ARGB_8888); 

       pcanvas = new Canvas(); 
       pcanvas.setBitmap(bitmap);     // drawXY will result on that Bitmap 
       pcanvas.drawBitmap(bm, 0, 0, null); 


    } 

    @Override 
    protected void onDraw(Canvas canvas) { 


    // draw a circle that is erasing bitmap    
     pcanvas.drawCircle(x, y, r, mPaint); 

     canvas.drawBitmap(bitmap, 0, 0,null); 

     super.onDraw(canvas); 

    } 



    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     // set paramete to draw circle on touch event 
     x = (int) event.getX(); 
      y = (int) event.getY(); 

      r =20; 
      // Atlast invalidate canvas 
      invalidate(); 
      return true; 
    } 

} 

BASIC主類呼喚的main.xml

package com.easyscratch.full; 

import android.app.Activity; 
import android.os.Bundle; 

public class easyscratch extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

,,如果只有反芻有人告訴我做什麼我錯了或者也許替代實現的

public Panel(Context context) { 
    super(context); 

無論如何非常感謝先進的真的會盡快appriciate一些幫助:)

CHEERS GUYS!

回答

1

Panel的構造函數還必須至少有一個AttributeSet字段。

public Panel(Context context, AttributeSet attr){ 
    super.(context, attr); 
+0

感謝您的回覆,我補充說,但現在它不會給我錯誤,它只是在我啓動應用程序時崩潰。我使用Galaxy Tab真實設備在2.2版本上測試我的應用程序。 – 2011-05-03 18:40:12

+0

你可能不得不啓動DDMS和發佈的logcat,看看是什麼原因造成死機。 – Maximus 2011-05-03 18:53:04

+0

其優良的,我想通了:)非常感謝您的答覆! – 2011-05-03 19:26:24