<span style="font-size:14px;">自己写的密码输入,未做ui,有做的可以参考
public class Secret extends View {
private int cWidth, cHeight, startX, startY, endX, endY;
//密码
private String secret = "";
//现在的数值
private int nowValue;
//上一次时间
private long lastTime;
//是否有效
private boolean effect;
//输入事件
private OnFinishListener finishListener;
public boolean isEffect() {
return effect;
}
public void setEffect(boolean effect) {
this.effect = effect;
}
public OnFinishListener getFinishListener() {
return finishListener;
}
public void setFinishListener(OnFinishListener finishListener) {
this.finishListener = finishListener;
}
public Secret(Context context) {
super(context);
}
public Secret(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Secret(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
int width = getWidth();
int height = getHeight();
if (4 * height > 5 * width) {//高度大于平均尺寸,以满宽作为总宽度进行计算
cWidth = width / 6;
cHeight = 3 * cWidth / 2;
startY = (height - 5 * cHeight) / 2;
endY = startY + 5 * cHeight;
startX = 0;
endX = width - 1;
} else {//宽度大于平均尺寸,以满高作为总宽度进行计算
cHeight = height / 5;
cWidth = 2 * cHeight / 3;
startX = (width - 6 * cWidth) / 2;
endX = startX + 6 * cWidth;
startY = 0;
endY = height - 1;
}
Paint paint = new Paint();
paint.setColor(Color.BLACK);
//画边线
canvas.drawLine(startX, startY, endX, startY, paint);
canvas.drawLine(startX, startY, startX, endY, paint);
canvas.drawLine(startX, endY, endX, endY, paint);
canvas.drawLine(endX, startY, endX, endY, paint);
//画横线
canvas.drawLine(startX, startY + cHeight, endX, startY + cHeight, paint);
canvas.drawLine(startX, startY + 2 * cHeight, endX, startY + 2 * cHeight, paint);
canvas.drawLine(startX, startY + 3 * cHeight, endX, startY + 3 * cHeight, paint);
canvas.drawLine(startX, startY + 4 * cHeight, endX, startY + 4 * cHeight, paint);
//画全长纵线
canvas.drawLine(startX + 2 * cWidth, startY, startX + 2 * cWidth, endY, paint);
canvas.drawLine(startX + 4 * cWidth, startY, startX + 4 * cWidth, endY, paint);
//画短纵线
canvas.drawLine(startX + cWidth, startY, startX + cWidth, startY + cHeight, paint);
canvas.drawLine(startX + 3 * cWidth, startY, startX + 3 * cWidth, startY + cHeight, paint);
canvas.drawLine(startX + 5 * cWidth, startY, startX + 5 * cWidth, startY + cHeight, paint);
//获取文字大小
paint.setTextSize(((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics())));
Paint.FontMetricsInt anInt = paint.getFontMetricsInt();
float ziWidth = paint.measureText("1");
int ziHeight = anInt.bottom - anInt.ascent;
float ziX = (2 * cWidth - ziWidth) / 2;
int ziY = (cHeight - ziHeight) / 2 - anInt.ascent;
canvas.drawText("7", startX + ziX, startY + cHeight + ziY, paint);
canvas.drawText("8", startX + 2 * cWidth + ziX, startY + cHeight + ziY, paint);
canvas.drawText("9", startX + 4 * cWidth + ziX, startY + cHeight + ziY, paint);
canvas.drawText("4", startX + ziX, startY + 2 * cHeight + ziY, paint);
canvas.drawText("5", startX + 2 * cWidth + ziX, startY + 2 * cHeight + ziY, paint);
canvas.drawText("6", startX + 4 * cWidth + ziX, startY + 2 * cHeight + ziY, paint);
canvas.drawText("1", startX + ziX, startY + 3 * cHeight + ziY, paint);
canvas.drawText("2", startX + 2 * cWidth + ziX, startY + 3 * cHeight + ziY, paint);
canvas.drawText("3", startX + 4 * cWidth + ziX, startY + 3 * cHeight + ziY, paint);
canvas.drawText("0", startX + 2 * cWidth + ziX, startY + 4 * cHeight + ziY, paint);
float delWidth = paint.measureText("删除");
float cleWidth = paint.measureText("清空");
float delX = (2 * cWidth - delWidth) / 2;
float cleX = (2 * cWidth - cleWidth) / 2;
canvas.drawText("删除", startX + 4 * cWidth + delX, startY + 4 * cHeight + ziY, paint);
canvas.drawText("清空", startX + cleX, startY + 4 * cHeight + ziY, paint);
int len = secret.length();
float secX = (cWidth - ziWidth) / 2;
for (int i = 0; i < len; i++) {
String str = secret.charAt(i) + "";
canvas.drawText(str, startX + i * cWidth + secX, startY + ziY, paint);
}
if (len >= 6 && !effect) {
effect=true;
if (finishListener != null) {
finishListener.onFinish();
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
if (startX < x && x < endX && startY + cHeight < y && y < endY) {
long nowTime = System.currentTimeMillis();
Log.e("cxd", nowTime + "");
int wid = ((int) (x - startX));
int hei = ((int) (y - startY - cHeight));
int num = 0;
if (hei < 3 * cHeight) {
num = 3 * (2 - hei / cHeight) + wid / (2 * cWidth) + 1;
} else {
int w = wid / (2 * cWidth);
switch (w) {
case 0://清空
num = 10;
break;
case 1://0
num = 0;
break;
case 2://删除
num = 11;
break;
}
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
nowValue = num;
lastTime = nowTime;
break;
case MotionEvent.ACTION_MOVE:
if (nowValue != num) {
nowValue = -1;
}
break;
case MotionEvent.ACTION_UP:
if (nowValue == num && nowTime - lastTime < 200) {
if (num == 11 && secret.length() > 0) {//删除
secret = secret.substring(0, secret.length() - 1);
} else if (num == 10) {//清空
secret = "";
} else if (num > -1 && num < 10 && secret.length() < 6) {
secret = secret + num;
}
invalidate();
}
break;
}
return true;
}
return false;
}
public interface OnFinishListener {
void onFinish();
}
}</span>
Android实际开发问题11_数字密码输入器
最新推荐文章于 2024-05-23 21:47:35 发布