自定义组件之会抖动的edittext

废话休提,先上效果图。

android自定义组件,所需重写的方法往往有:两参数的构造方法(布局加载必须)、ondraw()、ontouchevent()、onfocuschanged()等方法,不少的组件还需自定义attributeset。本组件的实现主要是借助ontouchevent、onfocuschanged和textwatcher以及一个自定义动画来实现的。

主要思路是,在onfocuschanged和ontextchanged方法中通过getconpounddrawable()和setcompounddrawable()来控制按钮的显隐,再通过ontouch事件判断坐标,模拟点击事件,来控制清除文字,定义一个动画方法,点击提交调用即可。

上代码:public class ClearEditText extends EditText implements OnFocusChangeListener,TextWatch

private Drawable mRightDrawable;
    public ClearEditText(Context context){
        this(context, null);
    }

    public ClearEditText(Context context, AttributeSet attrs) {
        this(context, attrs,android.R.attr.editTextStyle);
        // TODO Auto-generated constructor stub
    }
    public ClearEditText(Context context,AttributeSet attrs,int defStyle){
        super(context, attrs, defStyle);
        initClearEditText();
    }

    private void initClearEditText() {
        mRightDrawable = getCompoundDrawables()[2];
        if (mRightDrawable == null) {
            mRightDrawable = getResources().getDrawable(R.drawable.clear);
        }
        setRightDrawableVisible(false);
        setOnFocusChangeListener(this);
        addTextChangedListener(this);
    }

    private void setRightDrawableVisible(boolean b) {
        // TODO Auto-generated method stub
        Log.d("setVisible", "b‘s value is:"+String.valueOf(b));
        Drawable myFlagDrawable = b? mRightDrawable:null;
        if (myFlagDrawable == null) {
            Log.d("setVisible", "myflagDrawble is null");
        }
        else {
            myFlagDrawable.setBounds(0, 0, myFlagDrawable.getIntrinsicWidth(), myFlagDrawable.getIntrinsicHeight());//this is required or this is invisible
            Log.d("setVisible", "myflagDrawble is not null");
        }
        setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], myFlagDrawable, getCompoundDrawables()[3]);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        // TODO Auto-generated method stub
        Log.d("focus",String.valueOf(hasFocus) );
        if (hasFocus == true) {
            boolean visibility = getText().toString().length()>0 ? true : false;
            setRightDrawableVisible(visibility);
        }
        else {
            setRightDrawableVisible(hasFocus);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub

        float x = event.getX();
        //float y = event.getY();
        switch (event.getAction()) {
        case MotionEvent.ACTION_UP:
            if (x>getWidth()-mRightDrawable.getIntrinsicWidth()&&x<getWidth()) {
                setText("");
            }
            break;

        default:
            break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }
    @Override
      public void onTextChanged(CharSequence s, int start, int before, int count){
        Log.d("textchange","changed" );
          onFocusChange(this, true);
      };
      public void startShake(int counts){
         Animation animation = new TranslateAnimation(0, 10, 0 , 0);
         animation.setInterpolator(new CycleInterpolator(counts));//渐变器,位移动画帧数按照正弦函数重复变化 sinusoidal
         animation.setDuration(1000);
         startAnimation(animation);
      }
}

在ontextchanged里边回调onfoucuschange,来设置删除按钮的显隐

时间: 2024-10-13 15:38:14

自定义组件之会抖动的edittext的相关文章

自定义组件------带删除功能的EditText

以前在为EditText添加左侧图标,以及右侧一个删除按钮时,经常是使用FrameLayout,当这样代码复用差,维护也麻烦.最好的方法是重写EditText实现该功能.现在看看效果图,后面再讲解实现方式. 重写之后的组件有如下功能,只有当EditText内容不为空,而且获得焦点,才会出现删除按钮,点击删除按钮则清空内容.代码如下: public class CleanableEditText extends EditText { //回调函数 private TextWatcherCallBa

Android开发——构建自定义组件

Android中,你的应用程序程序与View类组件有着一种固定的联系,例如按钮(Button). 文本框(TextView), 可编辑文本框(EditText), 列表框(ListView), 复选框(CheckBox), 单选框(RadioButton), 滚动条(Gallery), 微调器(Spinner), 等等,还有一些比较先进的有着特殊用途的View组件,例如 AutoCompleteTextView, ImageSwitcher和 TextSwitcher.除此之外,种类繁多的像 线

Android 自定义组件之如何实现自定义组件

参考链接:http://blog.csdn.net/jjwwmlp456/article/details/41076699 简介 Android提供了用于构建UI的强大的组件模型.两个基类:View和ViewGroup. 可用Widget的部分名单包括Button, TextView, EditText, ListView, CheckBox,RadioButton, Gallery, Spinner,以及一些有特别作用的组件: AutoCompleteTextView, ImageSwitch

Vue1.0学习总结(4)———Vue1.0自定义组件、Vue1.0组件之间的通信

Vue自定义组件: 组件:就是一个大的对象:new Vue({})就是一个组件定义一个组件:1.全局组件: <div id="box"> <aaa></aaa> </div> var Aaa=Vue.extend({ template:'<h3>我是一个标题</h3>' }); Vue.component('aaa',Aaa); a)给自定义的组件添加数据: data必须是函数的形式,函数必须返回一个对象(json

【ExtJS】自定义组件datetimefield(一)

目的: ExtJS中提供了下拉日期选择控件Ext.form.field.Date与下拉时间选择控件Ext.form.field.Time.不过没有一个在选择日期时选择时间的控件datetimefield.目的就是运用自定义组件的方法,来扩展下拉日期选择控件Ext.form.field.Date,在下拉框中添加时间选择的组件.目标效果: 第一步:继承Ext.picker.Date,创建My.picker.DateTime类 1 Ext.define('My.picker.DateTime', {

1、开发自定义组件简要

一.自定义组件分类 Customized Component:继承VIew ,增加更多的属性和事件.  横向扩展 Compound Component: 继承ViewGroup , 把多个简单控件通过布局拼装一个复合控件.横向扩展 二.定义组件步骤 1 选择继承类(肯定是View or View的子类). 2 类的初始化:新增属性    属性的初值设定. 3 重载方法: 布局及呈现onDraw() , onMeasure() 事件(自定义事件)onKeyEvent() ...  监听器/重载函数

Vue结合原生js实现自定义组件自动生成

就目前三大前端主流数据驱动框架(vue,ng,react)而言,均具有创建自定义组件的api,但都是必须先做到事先写好挂载点,这个挂载点可以是原有静态元素标签也可以是自定义模板:对于多种组件通过同一数据流生成的,如果事先在页面上写好挂载点(mounted),然后通过dom操作去动态添加,会遇到类似这样一条错误提示信息:Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.(…).这又是为何呢,下一

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

Yii2.0 高级模版编写使用自定义组件(component)

翻译自:http://www.yiiframework.com/wiki/760/yii-2-0-write-use-a-custom-component-in-yii2-0-advanced-template/ 简单模版中添加自定义组件:http://www.yiiframework.com/wiki/747/write-use-a-custom-component-in-yii2-0/ 我们实现的是添加一个读取真实IP的组件,下面是详细步骤: 1. 在项目根目录的common目录中新建com