2011-06-16 101 views
0

我的自定義視圖並未完全顯示。請參閱我的截圖:自定義視圖在android中不能很好地顯示

enter image description here

和源代碼

package com.dots; 
import android.graphics.Color; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Dots1Activity extends Activity 
{ 
    private static final String TAG = "DotsActivity"; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LinearLayout ll = new LinearLayout(this); 
     ll.setOrientation(LinearLayout.VERTICAL);   


     LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

     CustomDrawableView view1 = new CustomDrawableView(this, 50, 50, Constants.DOTS_RADIUS, Constants.DOTS_COLOR); 
     CustomDrawableView view2 = new CustomDrawableView(this, 150, 150, Constants.DOTS_RADIUS, Constants.DOTS_COLOR); 
     CustomDrawableView view3 = new CustomDrawableView(this, 300, 300, Constants.DOTS_RADIUS, Constants.DOTS_COLOR); 
     ll.addView(view1, layoutParams); 
     ll.addView(view2, layoutParams); 
     ll.addView(view3, layoutParams); 
     setContentView(ll); 
    } 

} 

class CustomDrawableView extends View implements View.OnClickListener{ 
    private Context context; 
    private int x, y, radius, color; 
    public CustomDrawableView(Context context, int x, int y, int radius, int color) { 
     super(context); 
     this.context = context; 
     this.x = x; 
     this.y =y; 
     this.radius = radius; 
     this.color = color; 
     setOnClickListener(this); 
    } 

    protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 
     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(color); 
     canvas.drawCircle(x, y, radius, paint); 
    } 

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
     super.onMeasure(View.MeasureSpec.makeMeasureSpec(Constants.DOTS_RADIUS*2, View.MeasureSpec.EXACTLY), 
       View.MeasureSpec.makeMeasureSpec(Constants.DOTS_RADIUS*2, View.MeasureSpec.EXACTLY)); 
    } 

    public void onClick(View v) { 
     Toast.makeText(this.context, 
       x+"-"+y+"-"+radius, 
       Toast.LENGTH_SHORT).show(); 
    } 
} 



public interface Constants 
{ 
    public static final int DOTS_RADIUS = 50; 
    public static final int DOTS_COLOR = Color.GREEN; 
    public static final int NUM_DOTS_ROWS = 5; 
    public static final int NUM_DOTS_COLS = 5; 
    public static final int WIDTH_BETWEEN_DOTS = 100; 
    public static final int HEIGHT_BETWEEN_DOTS = 100; 


} 
+0

你的問題不清楚。什麼是問題,你想完成什麼? – 2011-06-16 18:22:45

回答

0

假設您不希望在截圖中看到裁剪。你的問題是,你在onMeasure返回值不佔你的X,Y偏移:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    super.onMeasure(View.MeasureSpec.makeMeasureSpec(Constants.DOTS_RADIUS*2 + x, View.MeasureSpec.EXACTLY), 
      View.MeasureSpec.makeMeasureSpec(Constants.DOTS_RADIUS*2 + y, View.MeasureSpec.EXACTLY)); 
} 
+0

謝謝你們,這個作品! 但有一件事我不會低估,是不是相對於屏幕左上角的x,y座標?所以爲什麼我必須添加偏移? – mamoo 2011-06-16 19:06:31

+0

這是相對於視圖。如果這對你有用,你應該接受答案。 – 2011-06-16 19:09:53

+0

確定它現在有一些意義,我將不得不多玩一點,以更好地理解它 非常感謝大家的幫助。真的很感激它。 – mamoo 2011-06-16 19:15:28

0

你到底要達到什麼樣的?如果你想要全屏顯示,那麼至少在視圖的寬度上使用FILL_PARENT標誌而不是WRAP_CONTENT。對於高度也有一個重量參數,可能有助於您的視野的高度。但由於它的自定義繪圖我不能幫助你進一步,如果有任何需要在您的視圖代碼的調整。你必須爲自己弄清楚。

+0

我想添加像一個點的網格 我將有5行和5列 和每行和列將包含像5個點,所以總共25個點,分佈在屏幕上 ,但是當我添加3個點,最後一個點被剪切,當我添加更多時,它就像點重疊,它們並不遍佈整個屏幕,而是位於小「矩形」中。我不能添加任何東西比矩形 – mamoo 2011-06-16 18:27:55

0

每個「點」的半徑是相同的,這將直接轉化爲您在返回答案onMeasure()。您正在更改中心的x和y位置,從實際的View畫布進一步發展。