2

私はこのような何かを達成したい:

ここに画像の説明を入力

囲まれたものについて話すと。私25は TextView になり2、その Text View の背景画像になると思います。ここでは、2その日のイベントの数を表します。ただし、イベントの数は動的にすることができます。

動的テキストを含む背景形状を作成するにはどうすればよいですか? 出来ますか?

編集

Mission Accomplished:-)

NPike のコードを拡張することで、必要な設計を実現しました。私は心の中で何か他のことを始めましたが。しかし、それに取り組んでいるうちに考えが変わり、今では最初に計画していたものよりも優れたデザインになったと思います.

ここに私のデザインがあります:

ここに画像の説明を入力

これが私のコードです:

android.content.Context をインポートします。android.graphics.Canvas をインポートします。android.graphics.Color をインポートします。android.graphics.Paint をインポートします。android.graphics.Typeface をインポートします。android.util.AttributeSet をインポートします。android.widget.TextView をインポートします。

public class MonthlyCalTextView extends TextView {
    private Paint mPaint;
    private String strNoOfEvents;


    public MonthlyCalTextView(Context context, AttributeSet attrs, String noOfEvents) {
        super(context, attrs); 

        strNoOfEvents = ( Integer.parseInt(noOfEvents)>100 )? "100+":noOfEvents;
        strNoOfEvents = (strNoOfEvents.equals("0")) ? "":strNoOfEvents;
        mPaint = new Paint();
        mPaint.setTypeface( Typeface.defaultFromStyle(Typeface.BOLD) );
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.rgb(223, 223, 223));
    }

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


    @Override
    protected void onDraw(Canvas canvas) {
        mPaint.setTextSize(35);
        canvas.drawText(strNoOfEvents, getMeasuredWidth()-mPaint.measureText(strNoOfEvents)-3, getMeasuredHeight()-3, mPaint);


        super.onDraw(canvas);
    }

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

        // grow view dimensions to account for circle
        setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());
    }

}

これが私がそれを呼んでいる方法です:

Random rand = new Random();
// Just for demo assuming that the no. of events will be between 0-125
int min=0, max=125;
String randomNum = String.valueOf( rand.nextInt(max - min + 1) + min );
MonthlyCalTextView tvData=new MonthlyCalTextView(CalendarMonthlyFragment.activity, null, randomNum);
4

2 に答える 2

3

このようなことを試してください:

<?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"
android:clickable="true" >

<RelativeLayout
    android:layout_width="10dp"
    android:layout_height="10dp"
    android:layout_centerInParent="true"
    android:layout_margin="5dp"
    android:background="@drawable/sample_image" >

    <TextView
        android:id="@+id/some_title"
        android:layout_width="10dp"
        android:layout_height="wrap_content"
        android:layout_margin="3dp"
        android:gravity="center"
        android:textColor="@android:color/white" />
</RelativeLayout>

Java クラスでは、相対レイアウトをビューにインフレートし、textView をインフレートされたビューの findById にインフレートします。

これがネイティブカレンダーアプリのやり方です。今日のビューを示します。

于 2013-02-07T18:28:25.817 に答える
3

onDraw をオーバーライドして円を描画する TextView の独自の拡張機能を作成できます。

以下に簡単な例を示します。

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

public class CircleTextView extends TextView {

    private static final int PADDING = 15;
    private Paint mCirclePaint;


    public CircleTextView(Context context, AttributeSet attrs) {
        super(context, attrs); 

        mCirclePaint = new Paint();
        mCirclePaint.setStyle(Style.FILL);
        mCirclePaint.setAntiAlias(true);
        mCirclePaint.setColor(Color.GREEN); 
    }


    @Override
    protected void onDraw(Canvas canvas) {
        // draw circle at center of canvas
        canvas.drawCircle(getMeasuredWidth()/2, getMeasuredHeight()/2, PADDING, mCirclePaint);
        super.onDraw(canvas);
    }

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

        // grow view dimensions to account for circle
        setMeasuredDimension(resolveSize(getMeasuredWidth()+(PADDING*2), widthMeasureSpec), resolveSize(getMeasuredHeight()+(PADDING*2), heightMeasureSpec));
    }

}
于 2013-02-07T18:40:47.717 に答える