Ich habe eine benutzerdefinierte Bildansicht zum Anzeigen einer Kreditkarte geschrieben. Um die Kreditkarte zu erstellen, habe ich ein Basisbild und ich habe Setter, um die PAN, Kartenhalter, Verfall einzustellen. Dieser Text muss auf das Basiskartenbild gezeichnet werden. Mein Problem besteht darin, die Position und Größe des Textes beizubehalten, so dass er immer korrekt aussieht, egal wie groß das Basisbild ist. Das einzige, auf das ich mich verlassen kann, ist das Seitenverhältnis des Bildes, das mit einer normalen Kreditkarte übereinstimmt.Skalieren Sie Text über Bild in benutzerdefinierter Bildansicht
Mein individuelles Image
public class CardView extends ImageView {
private String mPan = "4321";
private String mExpiry = "01/16";
private String mCardholder = "MR JOHN SMITH";
private float mPanTextSize = 22;
private float mOtherTextSize = 14;
private Paint mPanPaint = new Paint();
private Paint mCardholderPaint = new Paint();
public CardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initCardView();
}
public CardView(Context context, AttributeSet attrs) {
super(context, attrs);
initCardView();
}
public CardView(Context context) {
super(context);
initCardView();
}
private final void initCardView() {
mPanPaint.setColor(0xFFFFFFFF);
mPanPaint.setShadowLayer(1, 1, 1, 0xAA000000);
mPanPaint.setAntiAlias(true);
mPanPaint.setTextSize(mPanTextSize * getResources().getDisplayMetrics().scaledDensity);
mPanPaint.setTypeface(Typeface.MONOSPACE);
mCardholderPaint.setColor(0xFFFFFFFF);
mCardholderPaint.setShadowLayer(1, 1, 1, 0xAA000000);
mCardholderPaint.setAntiAlias(true);
mCardholderPaint.setTextSize(mOtherTextSize * getResources().getDisplayMetrics().scaledDensity);
mCardholderPaint.setTypeface(Typeface.MONOSPACE);
setPadding(0,0,0,0);
//setAdjustViewBounds(true);
setScaleType(ImageView.ScaleType.CENTER_INSIDE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float panLength = mPanPaint.measureText(mPan);
float x = (getWidth() - panLength)/2;
float y = -mPanPaint.ascent() + (getHeight() * 0.46f);
canvas.drawText(mPan, x, y, mPanPaint);
x = (getWidth() - panLength)/1.5f;
y = y - mCardholderPaint.ascent();
canvas.drawText(mExpiry, x, y, mCardholderPaint);
y = y - mCardholderPaint.ascent();
canvas.drawText(mCardholder, x, y, mCardholderPaint);
//super.onDraw(canvas);
}
public void setPan(String pan) {
mPan = pan;
invalidate();
}
public String getPan() {
return mPan;
}
public void setExpiry(String expiry) {
mExpiry = expiry;
invalidate();
}
public String getExpiry() {
return mExpiry;
}
public void setCardholder(String cardholder) {
mCardholder = cardholder;
invalidate();
}
public String getCardholder() {
return mCardholder;
}
}
Also manchmal sieht ok, aber wie Sie auf 10-Zoll-Bildschirme der Text erhalten, ist viel zu klein, direkt in der Mitte des Bildes (man stellte Blick auf einer Kreditkarte, aber die Nummer nimmt nur den Platz der mittleren 8 Ziffern), und wenn Sie zu kleinen Bildschirmen kommen, ist der Text zu groß, geht bis zu den Bildseiten oder über sie hinaus.
Irgendwelche Lösungen? Irgendeine Erklärung warum?
Hallo @Renard, ich habe versucht, was Sie vorgeschlagen, aber das Ergebnis ist immer noch das gleiche. – tbellenger