Android中自定义ImageView添加文字设置按下效果详解

前言

我们在上一篇文章教大家使用ImageView+TextView的组合自定义控件...可能在开发中你还需要其他功能,例如:按下效果,可以在代码中改变字体颜色,更换图片等等...

首先上效果图,看看是否是你需要的


效果图

下面开始撸代码

MyImageTextView.java

public class MyImageTextView extends LinearLayout {

 private ImageView mImageView = null;
 private TextView mTextView = null;
 private int imageId, pressImageId;
 private int textId, textColorId, textTopId, pressTextColorId;

 public MyImageTextView(Context context) {
  this(context, null);
 }

 public MyImageTextView(Context context, @Nullable AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public MyImageTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  this.setOrientation(LinearLayout.VERTICAL);//设置垂直排序
  this.setGravity(Gravity.CENTER);//设置居中
  if (mImageView == null) {
   mImageView = new ImageView(context);
  }
  if (mTextView == null) {
   mTextView = new TextView(context);
  }
  if (attrs == null)
   return;
  int count = attrs.getAttributeCount();
  for (int i = 0; i < count; i++) {
   String attrName = attrs.getAttributeName(i);//获取属性名称
   //根据属性获取资源ID
   switch (attrName) {
    //显示的图片
    case "image":
     imageId = attrs.getAttributeResourceValue(i, 0);
     break;
    //按下时显示的图片
    case "pressImage":
     pressImageId = attrs.getAttributeResourceValue(i, 0);
     break;
    //显示的文字
    case "text":
     textId = attrs.getAttributeResourceValue(i, 0);
     break;
    //设置文字颜色
    case "textColor":
     textColorId = attrs.getAttributeResourceValue(i, 0);
     break;
    //设置文字距离上面图片的距离
    case "textTop":
     textTopId = attrs.getAttributeResourceValue(i, 0);
     break;
    //按下时显示的文字颜色
    case "pressTextColor":
     pressTextColorId = attrs.getAttributeResourceValue(i, 0);
     break;

   }
  }
  init();

 }

 /**
  * 初始化状态
  */
 private void init() {
  this.setText(textId);
  mTextView.setGravity(Gravity.CENTER);//字体居中
  this.setTextColor(textColorId);
  this.setTextPaddingTop(textTopId);
  this.setImgResource(imageId);
  addView(mImageView);//将图片加入
  addView(mTextView);//将文字加入
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  int action = event.getAction();
  switch (action) {
   //按下
   case MotionEvent.ACTION_DOWN:
    if (pressImageId != 0)
     this.setImgResource(pressImageId);
    if (pressTextColorId != 0)
     this.setTextColor(pressTextColorId);
    break;
   //移动
   case MotionEvent.ACTION_MOVE:
    break;
   //抬起
   case MotionEvent.ACTION_UP:
    if (imageId != 0)
     this.setImgResource(imageId);
    if (textColorId != 0)
     this.setTextColor(textColorId);
    break;
  }
  return super.onTouchEvent(event);
 }

 /**
  * 设置默认的图片
  *
  * @param resourceID 图片id
  */
 public void setImgResourceDefault(int resourceID) {
  imageId = resourceID;
  setImgResource(resourceID);
 }

 /**
  * 设置按下的图片
  *
  * @param resourceID 图片id
  */
 public void setImgResourcePress(int resourceID) {
  pressImageId = resourceID;
 }

 /**
  * 设置显示的图片
  *
  * @param resourceID 图片ID
  */
 private void setImgResource(int resourceID) {
  if (resourceID == 0) {
   this.mImageView.setImageResource(0);
  } else {
   this.mImageView.setImageResource(resourceID);
  }
 }

 /**
  * 设置显示的文字
  *
  * @param text
  */
 public void setText(int text) {
  this.mTextView.setText(text);
 }

 /**
  * 设置字体颜色(默认为黑色)
  *
  * @param color
  */
 private void setTextColor(int color) {
  if (color == 0) {
   this.mTextView.setTextColor(Color.BLACK);
  } else {
   this.mTextView.setTextColor(getResources().getColor(color));
  }
 }

 /**
  * 设置默认的颜色
  *
  * @param color 颜色ID
  */
 public void setTextDefaultColor(int color) {
  textColorId = color;
  setTextColor(color);
 }

 /**
  * 设置按下的颜色
  *
  * @param color 颜色ID
  */
 public void setTextPressColor(int color) {
  pressImageId = color;
 }

 /**
  * 设置字体大小
  *
  * @param size
  */
 public void setTextSize(float size) {
  this.mTextView.setTextSize(size);
 }

 /**
  * 设置文字与上面的距离
  * @param top
  */
 public void setTextPaddingTop(int top) {
  if (top != 0)
   this.mTextView.setPadding(0, getResources().getDimensionPixelOffset(top), 0, 0);
 }

}

下面是属性文件

image_text.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <declare-styleable name="imageText">
  <attr name="image" format="integer" />
  <attr name="pressImage" format="integer" />
  <attr name="text" format="integer" />
  <attr name="textColor" format="integer" />
  <attr name="pressTextColor" format="integer" />
  <attr name="textTop" format="integer" />
 </declare-styleable>
</resources>

属性文件存放位置如下图


文件位置

下面我们来看看具体的调用方法


布局调用

当然我们也可以在Activity中进行再次设置, 例如:


在java中设置

这些都是在自定义View中的set方法...也可以根据具体的业务增删set方法.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android中自定义ImageView添加文字说明详解

    前言 大家应该都有所体会,在android开发中,需要展示图片的地方有很多..正常情况下展示一张图片的时候还需要在下面添加一个文字说明..我们也可以用布局ImageView+TextView来实现..最常见的就是底部菜单,或者顶部菜单...图标下面还要添加一个文字说明...重复多次使用ImageView+TextView来实现会感觉有点麻烦.. 下面就介绍一个简易的图片+文字的简单控件,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 上效果图 效果图 下面我们开始撸代码. MyI

  • Android中自定义ImageView添加文字设置按下效果详解

    前言 我们在上一篇文章教大家使用ImageView+TextView的组合自定义控件...可能在开发中你还需要其他功能,例如:按下效果,可以在代码中改变字体颜色,更换图片等等... 首先上效果图,看看是否是你需要的 效果图 下面开始撸代码 MyImageTextView.java public class MyImageTextView extends LinearLayout { private ImageView mImageView = null; private TextView mTe

  • Android中webview与JS交互、互调方法实例详解

    Android中webview与JS交互.互调方法实例详解 前言: 对于试水的功能,一般公司都会采用H5的方式来开发,可以用很少的资源与很短的项目工期来完成. 但许多情况下,H5页面会需要一些原生持有的一些如用户信息之类的数据,一些交互也需要调用原生的,如toast之类要保持同一个手机风格一致的交互行为.这个时候就需要能够让JS主动调用原生的方法来进行操作或者获取数据.或者是原生调用JS的方法在H5加载的时候传递一些参数. 对于原生调用JS的方法 我们需要实现一个WebViewClient,在这

  • Android进阶NestedScroll嵌套滑动机制实现吸顶效果详解

    目录 引言 1 自定义滑动布局,实现吸顶效果 1.1 滑动容器实现 1.2 嵌套滑动机制完成交互优化 1.2.1 NestedScrollingParent接口和NestedScrollingChild接口 1.2.2 预滚动阶段实现 1.2.3 滚动阶段实现 1.2.4 滚动结束 引言 在上一篇文章Android进阶宝典 -- 事件冲突怎么解决?先从Android事件分发机制开始说起中,我们详细地介绍了Android事件分发机制,其实只要页面结构复杂,联动众多就会产生事件冲突,处理不得当就是b

  • 解析Android中实现滑动翻页之ViewFlipper的使用详解

    1)View切换的控件-ViewFlipper介绍 ViewFilpper类继承于ViewAnimator类.而ViewAnimator类继承于FrameLayout. 查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果.该类有如下几个和动画相关的方法. setInAnimation:设置View进入屏幕时候使用的动画.该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID. setOut

  • Android中默认系统的声音/大小修改和配置详解

    前言 声音管理系统用来实现声音的输入和输出.声音的控制和路由等功能,包括主和各种音源的音量调节.声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理.音效的播放.音轨设置和播放.录音设置和启动等功能. 最近在做定制需求的时候,需要修改系统通知的声音,将其禁用掉,避免第三方应用发送通知时,声音很大吓到用户.索性就把通知声音关掉.下面就说说关闭声音的几种方法,以及修改系统默认声音的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 本文是基于Android5.1的代

  • Android中butterknife的使用与自动化查找组件插件详解

    前言 Android开发中经常使用findViewById来获取控件然后进行一些列操作,当控件太多的时候代码就非常臃肿,今天就来学习一个新的开源库ButterKnife,真的可以帮助我们高效,快捷的开发,让我们的代码更加简洁. 首先我们来把ButterKnife集成在我们的项目中:ButterKnife的GitHub官方地址:github.com/JakeWharton- 一.集成分为了两部分: 1.仅仅在App主工程使用: 在App的 build.gradle 中添加如下代码: android

  • android中px、sp与dp之间进行转换详解

    目录 相关名词解释 系统屏幕密度 单位换算方法 利用系统TypeValue类来转换 补充:sp与dp的区别 总结 由于Android手机厂商很多,导致了不同设备屏幕大小和分辨率都不一样,然而我们开发者要保持在不同设备上显示同样的视觉效果,就需要做一些适配效果. 相关名词解释 屏幕大小:通常指的是屏幕对角线的长度,使用“寸”为单位来衡量. 分辨率:指手机屏幕的像素点个数,例如:720*1280,指的是宽有720个像素点,高有1280个像素点. dpi:指的是每英寸像素,是由对角线上的像素点数除以屏

  • Maven中怎么手动添加jar包到本地仓库详解(repository)

    当我们的idea无法自动下在所需的Maven依赖时,我们可以到Maven的远程仓库中下载所需要的jar包,然后添加到我们的本地仓库中. 1.首先我们打开远程仓库的网址(https://mvnrepository.com/) 2.搜索我们需要的依赖文件(以mybatis为例),点击第一个MyBatis进入第3步 3.选择对应的版本,点击进入 4.点击jar,即可下载jar包 5.所需的jar包下载好后,可以将其放在D盘根目录下 6.再回到刚才的网页中,复制其jar包的坐标 7.根据坐标groupI

  • Android中wifi与数据流量的切换监听详解

    最近在做一个wifi和移动数据的监控功能,来来回回折腾了一阵子,这个模块的主要功能是监听整个APP的wifi与数据流量的切换,让用户使用专用流量,而不是用wifi,给一个弹窗,点击确认,自动切换数据流量,关闭wifi.我的思路是写一个静态广播,监听在广播里面进行监听,启用系统弹窗,点击确认,自动切换网络,这里面有一个坑就是弹窗会在广播中多次被调用,其实只调用了一次,但是实际上多次调用系统的弹窗会一个叠加一个,搞了好久,终于搞好了,原来是系统广播导致的叠加,详情看代码: 网络封装类Connecti

随机推荐