2016-02-06 55 views
0

我有一個自定義CircleButton類:編程創建的「○鍵」不拉絲

public class CircleButton extends ImageView { 

private int radius; 
private int x; 
private int y; 

public CircleButton(Context context) { 
    super(context); 
    constructorTask(); 
} 

public CircleButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    constructorTask(); 
} 

public CircleButton(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    constructorTask(); 
} 

public CircleButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    constructorTask(); 
} 


private void constructorTask() { 
    x = 300; 
    y = 300; 
    radius = 100; 
} 

@Override 
public void setPressed(boolean pressed) { 
    super.setPressed(pressed); 
    Log.i("Button Logger","Button Pressed"); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(x, y, radius, GameView.green); 
    Log.i("Drawing status", "CircleButton Drawing..."); 
} 

} 

我有一個單一的活動。此活動包含具有單個自定義視圖的相對佈局。

這是自定義視圖:

public class GameView extends View { 

public static Paint green = new Paint(); 

public GameView(Context context) { 
    super(context); 
    green.setARGB(255,0,255,0); 
} 

public GameView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    green.setARGB(255, 0, 255, 0); 

} 

public GameView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    green.setARGB(255, 0, 255, 0); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    Log.i("GameView Draw Status","Drawing..."); 
    Main.testButton.invalidate(); 
    invalidate(); 
} 

} 

這裏是活動代碼:

public class Main extends AppCompatActivity { 

public static CircleButton testButton; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    testButton = new CircleButton(getApplicationContext()); 
    makeFullScreen(); 

     RelativeLayout screenLayout = (RelativeLayout) findViewById(R.id.screenLayout); 
    screenLayout.addView(testButton); 
} 

private void makeFullScreen() {...} 

} 

出於某種原因,我testButton不被繪製。爲什麼沒有被繪製?

編輯一:這裏是我有的XML。編輯二:我做了一些進一步的調試,通過添加到相對佈局的正常按鈕,它工作正常。

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     testCircleButton = new CircleButton(getApplicationContext()); 
     makeFullScreen(); 

     testButton = new Button(getApplicationContext()); 
     testButton.setX(100); 
     testButton.setY(100); 
     testButton.setText("HELLO WORLD"); 

     RelativeLayout screenLayout = (RelativeLayout) findViewById(R.id.screenLayout); 
     screenLayout.addView(testCircleButton); 
     screenLayout.addView(testButton); 

     Log.i("Button Status","Adding Button To Layout"); 
    } 

出於某種原因,由circleButton不工作,但一個正常的按鈕是。

+0

您沒有將按鈕添加到佈局中,您只是創建了它的一個實例。將它添加到xml佈局文件或動態使用contentview – PrisonMike

+0

@ user2395334糟糕,只是添加它。但它仍然無法正常工作?也許我沒有正確添加它? – Roymunson

+0

你可以發佈xml的相關部分嗎? – PrisonMike

回答

1

您沒有指定視圖的大小(layout_widthlayout_height),因此您的視圖在0px×0px的空間內呈現,因此不可見。 在將視圖添加到佈局之前,您可以使用LayoutParams以編程方式設置它們。

例如以絕對尺寸:

testButton.setLayoutParams(new ViewGroup.LayoutParams(100,100)); 

雖然牢記PX和DIP之間的差異。您可能需要使用內部半徑屬性設置值,而不是對它們進行編碼。

+0

你可以給一些示例代碼如何使用LayoutParams設置我的自定義按鈕的寬度/高度? – Roymunson

+0

已編輯。也檢查這個答案http://stackoverflow.com/questions/9678785/android-setting-layoutparams-programmatically – Logain