[Android]给EditText添加图文hint

原因:

有时候我们需要当没有文字的时候背景显示一个图文混合的背景提示,这时候如果采用控件叠加的做法效率会很低,所以我们可以采用重载View的onDraw方法

解决方案:

这个是效果,那个搜索框。

package com.finals.teltem.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.EditText;

import com.finals.teltem.R;

public class SearchView extends EditText {

	float searchSize = 0;
	float textSize = 0;
	int textColor = 0xFF000000;
	Drawable mDrawable;
	Paint paint;

	public SearchView(Context context, AttributeSet attrs) {
		super(context, attrs);
		InitResource(context, attrs);
		InitPaint();
	}

	private void InitResource(Context context, AttributeSet attrs) {
		TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.searchedit);
		float density = context.getResources().getDisplayMetrics().density;
		searchSize = mTypedArray.getDimension(R.styleable.searchedit_imagewidth, 18 * density + 0.5F);
		textColor = mTypedArray.getColor(R.styleable.searchedit_textColor, 0xFF848484);
		textSize = mTypedArray.getDimension(R.styleable.searchedit_textSize, 14 * density + 0.5F);
		mTypedArray.recycle();
	}

	private void InitPaint() {
		paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(textColor);
		paint.setTextSize(textSize);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		DrawSearchIcon(canvas);
	}

	private void DrawSearchIcon(Canvas canvas) {
		if (this.getText().toString().length() == 0) {
			float textWidth = paint.measureText("搜索");
			float textHeight = getFontLeading(paint);

			float dx = (getWidth() - searchSize - textWidth - 8) / 2;
			float dy = (getHeight() - searchSize) / 2;

			canvas.save();
			canvas.translate(getScrollX() + dx, getScrollY() + dy);
			if (mDrawable != null) {
				mDrawable.draw(canvas);
			}
			canvas.drawText("搜索", getScrollX() + searchSize + 8, getScrollY() + (getHeight() - (getHeight() - textHeight) / 2) - paint.getFontMetrics().bottom - dy, paint);
			canvas.restore();
		}
	}

	@Override
	protected void onAttachedToWindow() {
		super.onAttachedToWindow();
		if (mDrawable == null) {
			try {
				mDrawable = getContext().getResources().getDrawable(com.finals.teltem.R.drawable.serarch);
				mDrawable.setBounds(0, 0, (int) searchSize, (int) searchSize);
			} catch (Exception e) {

			}
		}
	}

	@Override
	protected void onDetachedFromWindow() {
		if (mDrawable != null) {
			mDrawable.setCallback(null);
			mDrawable = null;
		}
		super.onDetachedFromWindow();
	}

	public float getFontLeading(Paint paint) {
		FontMetrics fm = paint.getFontMetrics();
		return fm.bottom - fm.top;
	}

}
时间: 2024-07-31 18:40:20

[Android]给EditText添加图文hint的相关文章

自定义ANDROID中EDITTEXT中的HINT文本的大小

EditText editText = (EditText) rootView.findViewById(R.id.et); // 新建一个可以添加属性的文本对象 SpannableString ss = new SpannableString("喝酒就要喝一斤!"); // 新建一个属性对象,设置文字的大小 AbsoluteSizeSpan ass = new AbsoluteSizeSpan(8,true); // 附加属性到文本 ss.setSpan(ass, 0, ss.len

android 开发edittext获取焦点时hint消失

默认情况时:设置了hint的话,需要输入的时候hint才会消失,但是现在是需要当edittext获取焦点时就让hint消失 代码如下: verifycode= (EditText)findViewById(R.id.verifycode); verifycode.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFoc

EditText添加边框

首先准备两张图片,一张是EditText获得焦点后的边框背景,一张是没有获得焦点时的背景,注意制作成9.png样式的图片,然后在drawable里添加一个selector_edittext_bg.xml文件,内容如下: <?xml version="1.0" encoding="utf-8"?><selectorxmlns:android="http://schemas.android.com/apk/res/android"&

解决Android界面布局添加EditText组件后界面无法预览

错误报告: Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V Exception details are logged in Window > Show View > Error Log 问题分析: 进入xml源文件里发现一个警告,提示添加inputType或者hint元素,添加后界面仍然无法预览... 仔细查看了当前使用的API等级 API 20:Android 4.4w,这是Android官网发布

Android下EditText的hint的一种显示效果------FloatLabelLayout

效果: 此为EditText的一种细节,平时可能用的不多,但是用户体验蛮好的,特别是当注册页面的项目很多的时候,加上这种效果,体验更好 仅以此记录,仅供学习参考. 参考地址:https://gist.github.com/chrisbanes/11247418 采用的是Android 3.0的动画,所以有版本限制,可以用  nineoldandroids  做向下兼容 ,当然上面的网址也给了另一种方式做向下兼容. demo地址:http://download.csdn.net/detail/ab

Android自定义EditText去除边框并添加下划线

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

Android系统中添加一个产品----图文详解

本文本着开源的精神介绍如何向一个Android系统中添加一个产品的整个过程,按照以下过程笔者有理由相信每个将要从事本行业的人都可以完成,其实添加一个产品并不难,难的是对其相关硬件的修改,好了废话不多说. 首先我们要创建一个属于自己产品的目录,这里以WY_device为例,以WY作为产品的名字. 首先从已经存在的产品中拷贝一个以产品的名字为名的.mk文件,修改为自己的.mk文件,在这里为WY.mk 对其进行如下的修改: 然后添加AndroidProducts.mk  这是添加产品的配置文件名路径,

android的edittext设置输入限制,只能输入数字

EditText的属性里面已经封装好了相关的设置,上一篇文章里面也提到了,不熟悉的可以去查看上一篇EditText属性大全,这里着重讲输入限制的属性: android:digits="1234567890.+-*/%\n()" 限制输入框中只能输入自己定义的这些字符串 如果输入其它将不予以显示 android:phoneNumber="true" 限制输入框中只能输入手机号码 android:password="true" 限制输入框中输入的任何

Android之EditText 属性汇总 +限定输入某些特殊字符

找了很多地方都没看到,经过尝试,发现这么一种方法可以达到限定edittext中的字符. android:digits="1234567890qwertyuiopasdfghjklzxcvbnm`-=[]\;,./[email protected]#$%^*()_+}{:?&<>"&apos;" 里面是可以输入的字符,大家根据自己的需求添加. 再摘抄一部分其他前辈的博文,留做备份 android:layout_gravity="center