对齐自定义视图的问题

Posted

技术标签:

【中文标题】对齐自定义视图的问题【英文标题】:Issue in aligning the custom view 【发布时间】:2012-05-22 19:26:09 【问题描述】:

我只是想从头开始实现 customView,即通过扩展视图类并覆盖 onDraw() 方法。只是试图建立一个简单的视图,一个现在只画一个圆圈的视图。我在对齐它时遇到了一些问题,我无法理解 android 是如何计算视图尺寸的。 只有视图,即 setContentView(new MyCustomView(this)) 工作正常......它占用了整个空间并绘制了圆圈。但是,如果我施加任何限制,即给予边距,或在 centerparent 中对齐它会使我的视图完全丢失并且它不会绘制任何东西。问题是视图被其父级剪裁但无法理解为什么它被剪裁。对此的任何帮助将不胜感激。这是我的代码。

这是我的自定义视图

    public class MyCustomView extends View 

    private Paint myPaint=null;
    private boolean useCenters;
    private float xCoordinate;
    private float yCoordinate;
    private float viewWidth;
    private float viewHeight;
    private int totalTime;
    private static float SWEEP_INC ;
    private RectF myRect;
    private boolean shouldInvalidate;
    private float mSweep;

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) 
        super(context, attrs, defStyle);
        initPaintComponents();
    

    public MyCustomView(Context context, AttributeSet attrs) 
        this(context, attrs,0);
    

    public MyCustomView(Context context) 
        this(context,null);
    

    private void initPaintComponents() 

        myPaint = new Paint();
        myPaint.setStyle(Paint.Style.STROKE);
        myPaint.setStrokeWidth(4);
        myPaint.setColor(0x880000FF);
        useCenters = false;
    


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        calculateCoordinates();
    

    private void calculateCoordinates() 

        xCoordinate = getX();
        yCoordinate = getY();
        viewWidth = getWidth();
        viewHeight = getHeight();
        myRect = new RectF(xCoordinate+3, yCoordinate+3, xCoordinate+viewWidth-(viewWidth/10), yCoordinate+viewHeight-(viewHeight/10));
        Log.i("SAMPLEARC","xcoordinate: "+xCoordinate+" ycoordinate: "+yCoordinate+" view width:"+viewWidth+" view height:"+viewHeight+" measured width: "+getMeasuredWidth()+"measured height:"+getMeasuredHeight());
    

    public int getTotalTime() 
        return totalTime;
    

    public void setTotalTime(int totalTime) 
        this.totalTime = totalTime;
        SWEEP_INC = (float)6/totalTime;

    

    @Override
    protected void onDraw(Canvas canvas) 
        super.onDraw(canvas);
        canvas.drawArc(myRect, 0, mSweep, useCenters, myPaint);

         mSweep += SWEEP_INC;
         if(mSweep > 280)
         
             myPaint.setColor(0x888800FF);
         

        invalidate();
    

我的活动:

@Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        MyCustomView myView = (MyCustomView) findViewById(R.id.customimg);
        myView.setTotalTime(10);
    

main.xml

  RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:background="@android:color/white"
   com.example.anim.MyCustomView android:id="@+id/customimg"
  android:layout_
  android:layout_
  android:layout_centerInParent="true"

如果我在 xml 中删除该 centerInParent,它将被绘制。所以在 onMeasure() 中调用 setMeasureDimentions() 也没有任何影响。但是 xcoodinate、ycoordinate、viewWidth 和 viewHeight 似乎给出了正确的值。只需要了解视图被裁剪的原因以及 android 在运行时如何计算尺寸。以及在绘制这些自定义视图时如何考虑边距参数。任何帮助将不胜感激。

提前致谢

【问题讨论】:

看到这个会帮你解决问题...***.com/questions/9205838/… 嗨 Himanshu 感谢您的帮助....但我实际上并不想画一个静态圆圈....我正在设计自己的自定义视图,这将类似于 android 中的任何视图(textview,edittext),一个可重用的视图,我可以在任何应用程序中使用它,并且可以包含在任何 xml 中。我的观点的 onMeasure() 有什么遗漏吗?在计算我的 rectF 的尺寸时,我是否必须考虑任何其他参数? 【参考方案1】:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:lib="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_
android:layout_ >

  <com.ind.Custom_Attribute.LibView  
  android:layout_ 
  android:layout_    
  android:text=""
  lib:xattr="Custom attribute APPLIED!"
  />

</LinearLayout>     

【讨论】:

嗨 Shivang,我无法理解您的确切意思。你能告诉我你到底想让我改变什么吗? 此行用于自定义属性 lib:xattr="自定义属性已应用!" 这是如何使用这个自定义链接,这里是带有 lib 的名称,所以使用 lib: 嗨 shivang,感谢您的帮助...但我不是想将自定义属性添加到我的自定义视图中,而是我试图让我的视图与现有参数/属性一起工作【参考方案2】:
<resources>
   <declare-styleable name="CustomAttrs">
    <attr name="xattr" format="string" />
</declare-styleable>
</resources>

在值/attrs.xml 中

【讨论】:

这是为自定义组件添加额外的参数。但这不是我的情况...我希望现有参数(边距,centerinparent)与我的自定义视图一起使用。非常感谢您的帮助。 在我的观点的 onMeasure() 中有什么遗漏吗?在计算我的 rectF 的尺寸时,我是否必须考虑任何其他参数?

以上是关于对齐自定义视图的问题的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 自定义对齐方式推动视图比父视图更宽

iPhone 5 和 4 上未对齐的自定义导航视图

将自定义节标题视图的左对齐与其他标准标题和单元格匹配

为什么在自定义交叉溶解segue中视图控制器的主视图不对齐?

具有自定义视图的 UIBarButtonItem 在 iOS 7 上用作左侧或右侧导航栏项目时未正确对齐

UIBarButtonItem在用作左侧或右侧导航栏项目时,自定义视图未在iOS 7上正确对齐