热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android中搜索图标和文字居中的EditText实例

效果图: 需要自定义view,具体实现如下: import android.widget.EditText; impo

效果图:

需要自定义view,具体实现如下:

import android.widget.EditText;

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

import com.example.administrator.mahu.R;

public class SearchView extends EditText {

  private float searchSize = 0;
  private float textSize = 0;
  private int textColor = 0xFF000000;
  private Drawable mDrawable;
  private 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(R.mipmap.search);
        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) {
    Paint.FontMetrics fm = paint.getFontMetrics();
    return fm.bottom - fm.top;
  }

}

在values---attrs下添加


    
    
    
 

搜索图片


在布局文件中调用如下

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


推荐阅读
  • 本文详细探讨了Android Activity中View的绘制流程和动画机制,包括Activity的生命周期、View的测量、布局和绘制过程以及动画对View的影响。通过实验验证,澄清了一些常见的误解,并提供了代码示例和执行结果。 ... [详细]
  • 本文探讨了在构建应用程序时,如何对不同类型的数据进行结构化设计。主要分为三类:全局配置、用户个人设置和用户关系链。每种类型的数据都有其独特的用途和应用场景,合理规划这些数据结构有助于提升用户体验和系统的可维护性。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • Python中HOG图像特征提取与应用
    本文介绍如何在Python中使用HOG(Histogram of Oriented Gradients)算法进行图像特征提取,探讨其在目标检测中的应用,并详细解释实现步骤。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • Android 6.0 切换指定 Wi-Fi 的解决方案
    本文详细介绍了在 Android 6.0 系统中切换到指定 Wi-Fi 的方法,包括常见的问题、原因分析及解决方案。通过官方文档和代码示例,帮助开发者更好地理解和实现这一功能。 ... [详细]
  • vivo Y5s配备了联发科Helio P65八核处理器,这款处理器采用12纳米工艺制造,具备两颗高性能Cortex-A75核心和六颗高效能Cortex-A55核心。此外,它还集成了先进的图像处理单元和语音唤醒功能,为用户提供卓越的性能体验。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • Android Studio 中查看应用程序崩溃日志的方法
    本文介绍如何在 Android Studio 中配置环境变量并使用 ADB 工具查看应用程序的崩溃日志,帮助开发者快速定位和解决问题。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 了解责任的苦与乐,是人生的重要课题。本文精选了一系列关于责任的经典语录,帮助读者更深入地理解责任感的重要性,并从中汲取力量。更多相关内容,请继续阅读。 ... [详细]
  • 本文详细介绍如何在 iOS 7 环境下申请苹果开发者账号,涵盖从访问开发者网站到最终激活账号的完整流程。包括选择个人或企业账号类型、付款方式及注意事项等。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
author-avatar
mobiledu2502869077
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有