2011-06-16 100 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画布进一步发展。