【问题标题】:Android : Draw Circle With Text InsideAndroid:用里面的文字画圆
【发布时间】:2014-01-17 04:57:33
【问题描述】:

我需要在我的片段中画三个圆圈,圆圈大小不同,我参考这个link 我得到的结果是这样的

这是我的 XML 代码:已更新

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center" >
         <TextView
             android:id="@+id/large_volume"
             android:layout_width="185dp"
             android:layout_height="185dp"
             android:background="@drawable/circle"
             android:gravity="center"
             android:text="My name is NON"
             android:textColor="#FFFFFF"
             android:textSize="10dp" />

         <TextView
             android:id="@+id/medium_volume"
             android:layout_width="120dp"
             android:layout_height="120dp"
             android:layout_alignTop="@+id/large_volume"
             android:layout_toRightOf="@+id/large_volume"
             android:background="@drawable/circle"
             android:gravity="center"
             android:text="My name is NON"
             android:textColor="#FFFFFF"
             android:textSize="10dp" />

         <TextView
             android:id="@+id/TextView02"
             android:layout_width="90dp"
             android:layout_height="90dp"
             android:layout_below="@+id/medium_volume"
             android:layout_toRightOf="@+id/large_volume"
             android:background="@drawable/circle"
             android:gravity="center"
             android:layout_marginTop="-3dp"
             android:layout_marginLeft="-17dp"
             android:text="My name is NON"
             android:textColor="#FFFFFF"
             android:textSize="10dp" />

    </RelativeLayout>

但我需要的是这样的

你可以看到圆圈必须靠得很近,但是当我使用 XML 视图时,我无法做到这一点。我怎样才能做到这一点,我的圈子里需要onClickListeners,这就是我使用视图的原因

这可以通过画布绘制实现吗,我听说画布不是视图所以这将限制我给点击监听器,如果我错了,请纠正我

更新:

我通过 XML 方法满足我的需求,有没有办法通过画布绘图来实现这一点,我应该为此发布另一个问题吗??

【问题讨论】:

  • 您可以尝试在视图中添加 -ve 值的填充
  • @RDC 谢谢你而不是 -ive 填充我给边距负值,这有助于我实现我需要的东西
  • @edwin 这些答案之一对您有用吗?请接受!谢谢!
  • @Rachael 我的问题是通过使用画布以编程方式实现它。但没有一个答案指出

标签: android android-layout android-canvas android-view


【解决方案1】:

试试这个

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/num_txt"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_marginTop="0dp"
                android:background="@drawable/bg_red"
                android:gravity="center"
                android:text="My name is NON"
                android:textColor="#FFFFFF"
                android:textSize="10dp" />

        </RelativeLayout>

    </RelativeLayout>

保存在drawable中bg_red.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="oval">
        <corners android:radius="10dip"/>
        <stroke android:color="#FF0000" android:width="5dip"/>
        <solid android:color="#FF0000"/>
    </shape>

编辑代码

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >
         <TextView
             android:id="@+id/num_txt"
             android:layout_width="185dp"
             android:layout_height="185dp"

             android:layout_alignParentTop="true"
             android:layout_marginTop="163dp"
             android:background="@drawable/bg_red"
             android:gravity="center"
             android:text="My name is NON"
             android:textColor="#FFFFFF"
             android:layout_marginLeft="10dp"
             android:textSize="10dp" />

         <TextView
             android:id="@+id/TextView02"
             android:layout_width="90dp"
             android:layout_height="90dp"
             android:layout_alignParentRight="true"
             android:layout_alignTop="@+id/TextView01"
             android:layout_marginRight="90dp"
             android:layout_marginTop="122dp"
             android:background="@drawable/bg_red"
             android:gravity="center"
             android:text="My name is NON"
             android:textColor="#FFFFFF"
             android:textSize="10dp" />

         <TextView
             android:id="@+id/TextView01"
             android:layout_width="120dp"
             android:layout_height="120dp"
             android:layout_alignTop="@+id/num_txt"
             android:layout_toRightOf="@+id/num_txt"
             android:background="@drawable/bg_red"
             android:gravity="center"
             android:text="My name is NON"
             android:textColor="#FFFFFF"
             android:textSize="10dp" />

    </RelativeLayout>

ConstraintLayout 用于徽章计数。

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:gravity="center">

        <ImageView
            android:id="@+id/tab_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:background="@android:color/transparent"
            android:scaleType="centerInside"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@drawable/ic_home"
            tools:layout_constraintBottom_creator="1"
            tools:layout_constraintLeft_creator="1"
            tools:layout_constraintRight_creator="1"
            tools:layout_constraintTop_creator="1" />

        <TextView
            android:id="@+id/tab_badge"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:background="@drawable/icon_badge"
            android:paddingBottom="1dp"
            android:paddingLeft="6dp"
            android:paddingRight="6dp"
            android:paddingTop="1dp"
            android:text="10"
            android:textAppearance="@style/TextAppearance.AppCompat.Small"
            android:textColor="@android:color/white"
            android:textSize="12dp"
            app:layout_constraintBottom_toBottomOf="@+id/tab_icon"
            tools:layout_constraintLeft_creator="1"
            android:layout_marginLeft="14dp"
            app:layout_constraintLeft_toLeftOf="@+id/tab_icon" />
    </android.support.constraint.ConstraintLayout>

【讨论】:

  • 感谢您删除了额外的布局,但它看起来仍然与我发布的图像相同,我将更新我的 xml 代码
  • 你可以看到小圆圈必须靠近大圆圈
【解决方案2】:

试试这个

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;

public class CircularTextView extends TextView
{
private float strokeWidth;
int strokeColor,solidColor;

public CircularTextView(Context context) {
    super(context);
}

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

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


@Override
public void draw(Canvas canvas) {

    Paint circlePaint = new Paint();
    circlePaint.setColor(solidColor);
    circlePaint.setFlags(Paint.ANTI_ALIAS_FLAG);

    Paint strokePaint = new Paint();
    strokePaint.setColor(strokeColor);
    strokePaint.setFlags(Paint.ANTI_ALIAS_FLAG);

    int  h = this.getHeight();
    int  w = this.getWidth();

    int diameter = ((h > w) ? h : w);
    int radius = diameter/2;

    this.setHeight(diameter);
    this.setWidth(diameter);

    canvas.drawCircle(diameter / 2 , diameter / 2, radius, strokePaint);

    canvas.drawCircle(diameter / 2, diameter / 2, radius-strokeWidth, circlePaint);

    super.draw(canvas);
}

public void setStrokeWidth(int dp)
{
    float scale = getContext().getResources().getDisplayMetrics().density;
    strokeWidth = dp*scale;

}

public void setStrokeColor(String color)
{
    strokeColor = Color.parseColor(color);
}

public void setSolidColor(String color)
{
    solidColor = Color.parseColor(color);

}
}

https://stackoverflow.com/a/34685568/2809351

【讨论】:

    【解决方案3】:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView tv = (TextView) findViewById(R.id.tv);
        Button btn = (Button) findViewById(R.id.btn);
        GradientDrawable gd = new GradientDrawable();
        gd.setShape(GradientDrawable.OVAL);
        gd.setColor(Color.TRANSPARENT);
        gd.setStroke(5, Color.BLUE);
        gd.setSize(getTextViewHeight(tv),getTextViewHeight(tv));
    
        tv.setBackground(gd);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                GradientDrawable gd = new GradientDrawable();
                gd.setShape(GradientDrawable.OVAL);
                gd.setColor(Color.TRANSPARENT);
                gd.setStroke(5, Color.BLUE);
                gd.setSize(tv.getHeight(),tv.getHeight());
                Log.d("DB121","Width "+tv.getHeight()+ "Height ="+tv.getHeight());
                tv.setBackground(gd);
            }
        });
    }
    public static int getTextViewHeight(TextView textView) {
        WindowManager wm =
                (WindowManager) textView.getContext().getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
    
        int deviceWidth;
    
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
            Point size = new Point();
            display.getSize(size);
            deviceWidth = size.x;
        } else {
            deviceWidth = display.getWidth();
        }
    
        int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
        int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        textView.measure(widthMeasureSpec, heightMeasureSpec);
        return textView.getMeasuredHeight();
    }
    

    【讨论】:

      【解决方案4】:

      试试这段代码用textview动态创建圆

      RelativeLayout main_rel_layout = findViewById(R.id.main_rel_layout);
      TextView textView = new TextView(this);
      RelativeLayout relativeLayout = new RelativeLayout(this);
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
      params.addRule(RelativeLayout.CENTER_IN_PARENT);
      textView.setText("Hello ");
      textView.setTextSize(100);
      textView.setLayoutParams(params);
      textView.setGravity(Gravity.CENTER);
      
      final FrameLayout frameLayout = new FrameLayout(this);
      FloatingActionButton floatingActionButton = new FloatingActionButton(this);
      floatingActionButton.setCustomSize(400);
      frameLayout.addView(floatingActionButton);
      
      relativeLayout.addView(frameLayout);
      relativeLayout.addView(textView);
      main_rel_layout.addView(relativeLayout);
      

      【讨论】:

        【解决方案5】:
        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >
        
            <TextView
                 android:id="@+id/TextView02"
                android:layout_width="125dp"
                android:layout_height="125dp"
                android:layout_alignBottom="@+id/linearLayout1"
                android:layout_marginBottom="83dp"
                android:layout_toEndOf="@+id/linearLayout1"
                android:background="@drawable/circle"
                android:gravity="center"
                android:text="TextView"
                android:layout_marginEnd="5dp"
                android:orientation="vertical" />
        
            <TextView
                android:id="@+id/textView1"
                android:layout_width="185dp"
                android:layout_height="185dp"
                android:layout_marginStart="5dp"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:background="@drawable/circle"
                android:gravity="center"
                android:text="TextView" 
                android:orientation="vertical" />
        
            <TextView
                android:id="@+id/TextView01"
                android:layout_width="90dp"
                android:layout_height="90dp"
                android:layout_alignTop="@+id/linearLayout1"
                android:layout_marginTop="113dp"
                android:layout_toEndOf="@+id/linearLayout1"
                android:background="@drawable/circle"
                android:gravity="center"
                android:text="TextView" 
                android:orientation="vertical" />
        
        </RelativeLayout>
        

        您可以直接设置背景或可绘制到文本视图。 你可以使用drawablepadding等.....

        或者你可以使用: android:drawableStart="@drawable/ic_cab_done_holo_dark"

        【讨论】:

        • 我没有在我的 textview 中设置任何可绘制对象,那么为什么我应该使用 drawablepadding 呢?对我有什么帮助??
        • 为此您需要创建自定义视图,并在 onDraw() 方法中绘制带有背景和文本的圆圈。
        • @DeepchandSingh 我通过 XML 实现了我的需求,你能展示它如何通过 onDraw 方法实现
        • @edwin 如果您通过 XML 实现,那就太好了。如果您想尝试使用画布,请查看:v2beastzbroz.blogspot.in/2013/06/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        相关资源
        最近更新 更多