Android 常用且比较好看的EditText(一)——带动画的EditText搜索框

Android EditText

EditText

Android 的 EditText在项目和程序代码书写阶段还是经常会使用到的
对于有了一定Android基础后,就会开始追求ui界面的设计

所以根据以前书写的项目和代码,自己归纳了一下自己常用的EditText
感觉也比较好用,也有一定的美观度

我们先看效果图

效果图

这是之前一个程序自己编写代码的时候的gif示例图
在这里插入图片描述
可以看到 上面有一个带动画的搜索框
感觉有一个动画的特效有些时候还是可以增添一些ui的风格的
毕竟有动画的嘛

具体实现

首先呢 我们来看一下布局

<RelativeLayout
        android:id="@+id/lay_search"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_gravity="right"
        android:background="@drawable/shape_search_bg">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/iv_search"
                android:layout_width="36dp"
                android:layout_height="36dp"
                android:onClick="onClick"
                android:padding="6dp"
                android:src="@drawable/search" />

            <EditText
                android:id="@+id/ed_search"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginTop="0dp"
                android:layout_weight="1"
                android:background="@null"
                android:ems="8"
                android:imeOptions="actionSearch"
                android:padding="5dp"
                android:singleLine="true"
                android:textColor="#000"
                android:textCursorDrawable="@drawable/cursor_style"
                android:textSize="14sp"
                android:visibility="gone" />

            <ImageView
                android:id="@+id/iv_close"
                android:layout_width="36dp"
                android:layout_height="36dp"
                android:onClick="onClick"
                android:padding="8dp"
                android:src="@drawable/close"
                android:visibility="gone" />
        </LinearLayout>
    </RelativeLayout>
//shape_search_bg
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="24dp"/>
    <solid android:color="@color/colorPrimaryDark"/>

</shape>

//cursor_style
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    android:shape = "rectangle" >
    <size android:width="1dp"/>
    <solid android:color="#000"/>
</shape>

可以看到,最外层是一个相对布局
这个呢 我的理解是收缩时的整个组件的样子 然后我还写了一个drawable的文件来规定样式

然后呢是一个线性布局,因为通过动画展开之后,可以看到是有两张图和一个EditText的 (就是下面两张图
所以是要采用线性布局的方式,然后一开始是收缩的,我们再到主活动中设置监听 在点击的时候进行动画的展开
在这里插入图片描述
在这里插入图片描述

MainActivity

//搜索框
    private ImageView ivSearch,ivClose;
    private EditText edSearch;
    private RelativeLayout laySearch;
    private AutoTransition autoTransition;
    private int width;
    
	laySearch = (RelativeLayout)findViewById(R.id.lay_search);
 	ivSearch = (ImageView)findViewById(R.id.iv_search);
	ivClose = (ImageView)findViewById(R.id.iv_close);
	edSearch = (EditText) findViewById(R.id.ed_search);
	
	WindowManager manager = getWindowManager();
	DisplayMetrics metrics = new DisplayMetrics();
	manager.getDefaultDisplay().getMetrics(metrics);
	width = metrics.widthPixels;
	
	edSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId == EditorInfo.IME_ACTION_SEARCH){
                    String city = edSearch.getText().toString();
                    if(!TextUtils.isEmpty(city)){
                        Toast.makeText(MainActivity.this,city,Toast.LENGTH_SHORT).show();
                    }else {
                        Toast.makeText(MainActivity.this,"请输入内容",Toast.LENGTH_SHORT).show();
                    }
                }
                return false;
            }
        });

    public void onClick(View view){
        switch (view.getId()){
            case R.id.iv_search:
                initExpand();
                break;
            case R.id.iv_close:
                initClose();
                break;
        }
    }

 //设置伸展状态时的布局
    private void initExpand() {
    	//自己设置hint
        edSearch.setHint("输入城市名");
        edSearch.setHintTextColor(Color.BLACK);
        edSearch.setVisibility(View.VISIBLE);
        ivClose.setVisibility(View.VISIBLE);
        LinearLayout.LayoutParams LayoutParams = (LinearLayout.LayoutParams) laySearch.getLayoutParams();
        LayoutParams.width = dip2px(px2dip(width)-40);
        LayoutParams.setMargins(dip2px(0),dip2px(0),dip2px(0),dip2px(0));
        laySearch.setPadding(14,0,14,0);
        laySearch.setLayoutParams(LayoutParams);

        edSearch.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                edSearch.setFocusable(true);
                edSearch.setFocusableInTouchMode(true);
                return false;
            }
        });
        //开始动画
            beginDelayedTransition(laySearch);
    }

    //设置收缩状态时的布局
    private void initClose() {
        edSearch.setVisibility(View.GONE);
        edSearch.setText("");
        ivClose.setVisibility(View.GONE);

        LinearLayout.LayoutParams LayoutParams = (LinearLayout.LayoutParams) laySearch.getLayoutParams();
        LayoutParams.width = dip2px(48);
        LayoutParams.height = dip2px(48);
        LayoutParams.setMargins(dip2px(0),dip2px(0),dip2px(0),dip2px(0));
        laySearch.setLayoutParams(LayoutParams);

        //隐藏键盘
        InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(this.getWindow().getDecorView().getWindowToken(),0);
        edSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                edSearch.setCursorVisible(true);
            }
        });
        beginDelayedTransition(laySearch);
    }

    //过渡动画
    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void beginDelayedTransition(ViewGroup view) {
        autoTransition = new AutoTransition();
        autoTransition.setDuration(500);
        TransitionManager.beginDelayedTransition(view,autoTransition);
    }


    private int dip2px(float dpVale){
        final float scale = getResources().getDisplayMetrics().density;
        return (int) (dpVale * scale + 0.5f);

    }
    private int px2dip(float pxValue){
        final float scale = getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

还是有一定的代码量的 接下来一一讲解一下

  • 在绑定布局之后 我们通过WindowManager 和 DisplayMetrics 的一些操作来获取屏幕大小来达到适配屏幕的目的,不然可能会因为不同手机而早上不适配的情况
  • 往下的代码 是监听里面的EditText的内容的
  • 然后是两张图片的点击,一个是展开 一个是收缩
  • 展开,让EditText和收缩的按钮 可见 然后设置长、宽和其他的一些参数(通过注释也应该不难理解)
  • 然后是收缩,跟展开是差不读的
  • 接下来是一个过渡动画
  • 最后则是px和dp的一个转换

到这里就结束了
具体应该没有很难理解
这就是一个带动画的EditText的一个实现

之后还会有另外一个我比较喜欢用的EditText的一个介绍
其实就是Material Design当中的TextInputEditText 这个也是很常用
也相信大家学了Material Design也都会接触到

代码都不易,大家共同努力❤💖

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
要实现自定义搜索框EditText)的搜索功能,你可以按照以下步骤进行: 1.在你的布局文件中添加一个EditText和一个搜索按钮(可选)。 ```xml <RelativeLayout ... <EditText ... android:id="@+id/search_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/search_hint" android:imeOptions="action_search" android:inputType="text" android:maxLines="1" android:singleLine="true" /> <ImageButton ... android:id="@+id/search_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:src="@drawable/ic_search" /> </RelativeLayout> ``` 2.在你的Activity(或Fragment)中找到EditText和ImageButton并设置OnClickListener。 ```java public class MainActivity extends AppCompatActivity { private EditText searchEdit; private ImageButton searchBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); searchEdit = findViewById(R.id.search_edit); searchBtn = findViewById(R.id.search_btn); searchBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 执行搜索操作 performSearch(); } }); // 设置软键盘的搜索按钮监听器 searchEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { // 执行搜索操作 performSearch(); return true; } return false; } }); } private void performSearch() { String keyword = searchEdit.getText().toString().trim(); // 执行搜索操作,比如跳转到搜索结果页面 Intent intent = new Intent(this, SearchResultActivity.class); intent.putExtra("keyword", keyword); startActivity(intent); } } ``` 3.在performSearch()方法中执行搜索操作,比如跳转到搜索结果页面,并将搜索关键字作为参数传递给搜索结果页面。 在搜索结果页面中,你可以使用搜索关键字来查询数据库或网络数据,并将结果显示在ListView或RecyclerView中。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iㅤ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值