android自定义登录框,Android自定义EditText实现登录界面

本文实例为大家分享了Android自定义EditText实现登录界面的具体代码,供大家参考,具体内容如下

先看效果图:

46ff73fe65d0e7c5e73a433c986a033d.gif

自定义edittext 控件,监听focus和textchange 状态 实现是否显示删除图片。

public class ClearEditText extends EditText implements OnFocusChangeListener,

TextWatcher {

private Drawable right;

private boolean hasfocus;

private Drawable mClearDrawable;

public ClearEditText(Context context) {

this(context, null);

}

public ClearEditText(Context context, AttributeSet attrs) {

// 这个属性不加 没法用

this(context, attrs, android.R.attr.editTextStyle);

}

public ClearEditText(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

// 初始化删除的资源图片

mClearDrawable = getCompoundDrawables()[2];

if (mClearDrawable == null) {

mClearDrawable = getResources().getDrawable(R.drawable.ic_close1);

}

mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(),

mClearDrawable.getIntrinsicHeight());

clearText(false);

setOnFocusChangeListener(this);

addTextChangedListener(this);

}

@Override

public void onFocusChange(View v, boolean hasfocus) {

this.hasfocus = hasfocus;

if (hasfocus) {

clearText(getText().length() > 0);

} else {

clearText(false);

}

}

@Override

public void onTextChanged(CharSequence text, int start, int lengthBefore,

int lengthAfter) {

// TODO Auto-generated method stub

if (hasfocus) {

clearText(text.length() > 0);

}

}

private void clearText(boolean visible) {

if (visible) {

right = mClearDrawable;

} else {

right = null;

}

setCompoundDrawables(getCompoundDrawables()[0],

getCompoundDrawables()[1], right, getCompoundDrawables()[3]);

// right.setBounds(0, 0, right.getIntrinsicWidth(),

// right.getIntrinsicHeight());

}

//getTotalPaddingRight 返回 又padding加上图片占据的宽度 在这个范围内 即判断是否点击了删除按钮

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_UP) {

if (getCompoundDrawables()[2] != null) {

boolean t = event.getX() > (getWidth() - getTotalPaddingRight())

&& (event.getX() < ((getWidth() - getPaddingRight())));

if (t) {

this.setText("");

}

}

}

return super.onTouchEvent(event);

}

@Override

public void afterTextChanged(Editable arg0) {

// TODO Auto-generated method stub

}

@Override

public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,

int arg3) {

// TODO Auto-generated method stub

}

/**

* 设置晃动动画

*/

public void setShakeAnimation() {

this.setAnimation(shakeAnimation(5));

}

// 可以设置1秒钟晃动s下

public static Animation shakeAnimation(int s) {

Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);

translateAnimation.setInterpolator(new CycleInterpolator(s));

translateAnimation.setDuration(1000);

return translateAnimation;

}

}

自定义TextView 实现字体从上到下显示:

public class CustomText extends TextView {

private String text;

private Paint paint;

private Rect rect = new Rect();

private int initTopDistance = 8;

public CustomText(Context context) {

super(context, null);

// TODO Auto-generated constructor stub

}

public CustomText(Context context, AttributeSet attrs) {

this(context, attrs, 0);

// TODO Auto-generated constructor stub

}

public CustomText(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

text = (String) getText();

DisplayMetrics metric = new DisplayMetrics();

WindowManager windowmanager = (WindowManager) context

.getSystemService(Context.WINDOW_SERVICE);

windowmanager.getDefaultDisplay().getMetrics(metric);

//得到字体大小

int size = (int) getTextSize();

//转换成SP

int s= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, size, metric);

paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setDither(true);

paint.setColor(0xffffffff);

if(s!=0)

paint.setTextSize(s);

Typeface t= Typeface.createFromAsset(context.getResources().getAssets(), "fonts/font.TTF");

paint.setTypeface(t);

paint.setShadowLayer(60, 30, 30, 0xff00ffff);

}

// @Override

// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

//

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

// int modeWidth=MeasureSpec.getMode(widthMeasureSpec);

// int modeHeight=MeasureSpec.getMode(heightMeasureSpec);

// int widthSize=MeasureSpec.getSize(widthMeasureSpec);

// int heightSize=MeasureSpec.getSize(heightMeasureSpec);

//

// int width=0;

// int heigh=0;

// if(modeWidth==MeasureSpec.AT_MOST)

//

// width=getMaxTextWdith(getStrings())+getPaddingLeft()+getPaddingRight();

//

// if(modeHeight==MeasureSpec.AT_MOST)

// heigh=getMaxTextHeight(getStrings())+getPaddingTop()+getPaddingBottom();

//

// setMeasuredDimension(width=modeWidth==MeasureSpec.AT_MOST?width:widthSize,

// height=modeHeight==MeasureSpec.AT_MOST?height:heightSize);

//

//

// }

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

// TODO Auto-generated method stub

super.onSizeChanged(w, h, oldw, oldh);

width = w;

height = h;

}

private void measureText(String str) {

paint.getTextBounds(str, 0, str.length(), rect);

FontMetrics fm = paint.getFontMetrics();

textHeight = (int) (fm.ascent + fm.descent);

}

private int textHeight;

private int width;

private int height;

private int num;

//转化为 单个字的字符串

public String[] getStrings(){

num = text.length();

String[] strings = new String[num];

for (int i = 0; i < num; i++) {

char c = text.charAt(i);

strings[i] = String.valueOf(c);

}

return strings;

}

/**返回字体最长的宽度

* @param strs

* @return

*/

public int getMaxTextWdith(String[] strs){

int w=0;

for(int i=0;i

measureText(strs[i]);

w=Math.max(rect.width(), w);

}

return w;

}

/**返回字体最高的高度

* @param strs

* @return

*/

public int getMaxTextHeight(String[] strs){

int h=0;

for(int i=0;i

measureText(strs[i]);

h=Math.max(-textHeight, h);

}

return h;

}

@Override

protected void onDraw(Canvas canvas) {

String[] strings=getStrings();

float starty = 1.0f * height / num;

//Y坐标变化

float changeY = 0;

for (int j = 0; j < num; j++) {

//测量字体宽度和高度

measureText(strings[j]);

//没个字体上下的间隔

changeY = starty * j;

int left=getWidth() / 2 - rect.width() / 2

+ getPaddingLeft() + getPaddingRight();

int top=(int) (starty/2-textHeight+ changeY + getPaddingTop() + getPaddingBottom());

canvas.drawText(strings[j], left, top, paint);

}

}

}

布局xml:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/meishi"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:background="@drawable/ic_meishi" >

android:id="@+id/tttt"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_alignParentRight="true"

android:text="味道"

android:textSize="40sp"

/>

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:orientation="vertical" >

android:id="@+id/count"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:padding="8dp"

android:gravity="center"

android:layout_marginTop="20dp"

>

android:id="@+id/text_count"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:padding="8dp"

android:text="帐号"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginRight="20dp"

android:layout_toRightOf="@+id/text_count"

android:background="@drawable/edittext"

android:drawableRight="@drawable/ic_close1"

android:gravity="center_vertical"

android:hint="请输入帐号"

android:textSize="16sp"

android:padding="8dp"

android:singleLine="true" >

android:id="@+id/password"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:padding="8dp"

>

android:id="@+id/text_password"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:padding="8dp"

android:text="密码" />

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginRight="20dp"

android:layout_toRightOf="@+id/text_password"

android:background="@drawable/edittext"

android:drawableRight="@drawable/ic_close1"

android:gravity="center_vertical"

android:hint="请输入密码"

android:padding="8dp"

android:textSize="16sp"

android:singleLine="true" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="16dp" >

android:id="@+id/login"

android:layout_width="wrap_content"

android:layout_height="30dp"

android:layout_marginLeft="50dp"

android:textSize="16sp"

android:background="@drawable/button_selector"

android:text="登录"

/>

android:layout_width="wrap_content"

android:layout_height="30dp"

android:layout_marginLeft="80dp"

android:layout_toRightOf="@+id/login"

android:background="@drawable/button_selector"

android:text="注册"

android:textSize="16sp" />

button_selector   xml

android:drawable="@drawable/button_press" />"

press:

xmlns:android="http://schemas.android.com/apk/res/android">

android:startColor="@color/deep_red"

android:centerColor="#ffffffff"

android:endColor="@color/oranger_red"

android:angle="90"

>

android:color="#FF6666"/>

normal:

xmlns:android="http://schemas.android.com/apk/res/android">

android:startColor="#FF3333"

android:centerColor="#ffffffff"

android:endColor="#FF9966"

android:angle="90"

>

android:color="#ededed"/>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值