详解Android如何实现阴影效果

144 篇文章 12 订阅

目录

实现形式

elevation

Material Design提供了View的阴影效果设置。主要由两个属性决定:elevation和translationZ。

Z = elevation + translationZ

PS:这种实现方式只有API21以及以上才能支持实现。

elevation属性表示View高度加上高度就会有阴影效果。 translationZ属性表示给View增加一个Z轴的变换效果。配合elevation属性一起使用阴影效果更突出。

1

2

3

4

5

6

7

8

9

<androidx.appcompat.widget.LinearLayoutCompat

    android:layout_margin="15dp"

    android:layout_width="match_parent"

    android:layout_height="100dp"

    android:background="@android:color/holo_blue_bright"

    android:elevation="10dp"

    android:translationZ="10dp"

    android:paddingBottom="10dp"

    />

官网介绍 

CardView属性

CardViewAndroid提供的官方控件自身支持设置阴影效果。阴影实现由cardElevationcardMaxElevation实现。

1

2

3

4

5

6

7

8

9

<androidx.cardview.widget.CardView

    android:layout_margin="15dp"

    android:layout_width="match_parent"

    android:layout_height="100dp"

    android:outlineAmbientShadowColor="@android:color/holo_blue_bright"

    android:outlineSpotShadowColor="@android:color/holo_red_dark"

    app:cardElevation="5dp"

    app:cardMaxElevation="10dp"

    />

 

shadow属性

若是TextView则可以通过shadow属性实现阴影效果

1

2

3

4

5

6

7

8

9

10

11

12

<TextView

android:id="@+id/test_shadow"

android:layout_gravity="center"

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:shadowColor="#aa22ff22"

android:shadowDx="0"

android:shadowDy="0"

android:shadowRadius="10"

android:text="Test Shadow"

android:textColor="#cc000000"

android:textSize="60sp" />

layer配置文件

通过配置xmllayer属性文件实现阴影效果。使用layer-list实现两层不同背景色实现叠加实现像是阴影的效果,但最终实现效果并不是例如CardView的渐变阴影效果。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 阴影图片,android:left表示阴影图片左边到背景图片左边的距离

    android:top表示阴影图片上边到背景图片上边的距离-->

    <item android:left="5dp"

        android:top="5dp">

        <shape>

            <solid android:color="#60000000"/>

        </shape>

    </item>

    <!-- 背景图片,android:right表示阴影图片右边到背景图片右边的距离

    android:bottom表示阴影图片下边到背景图片下边的距离-->

    <item android:bottom="5dp"

        android:right="5dp">

        <shape>

            <solid android:color="#000000"/>

        </shape>

    </item>

</layer-list>

 

自定义实现

自定义形式是通过自定义Drawable实现,该形式实现目标View必须关闭硬件加速。自定义Drawable主要通过重写draw方法绘制矩形或圆形形状增加阴影效果。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@Override

public void draw(@NonNull Canvas canvas) {

    if (mBgColor != null) {

        if (mBgColor.length == 1) {

            mBgPaint.setColor(mBgColor[0]);

        } else {

            mBgPaint.setShader(new LinearGradient(mRect.left, mRect.height() / 2, mRect.right,

                    mRect.height() / 2, mBgColor, null, Shader.TileMode.CLAMP));

        }

    }

    if (mShape == SHAPE_ROUND) {

        canvas.drawRoundRect(mRect, mShapeRadius, mShapeRadius, mShadowPaint);

        canvas.drawRoundRect(mRect, mShapeRadius, mShapeRadius, mBgPaint);

    } else {

        canvas.drawCircle(mRect.centerX(), mRect.centerY(), Math.min(mRect.width(), mRect.height())/ 2, mShadowPaint);

        canvas.drawCircle(mRect.centerX(), mRect.centerY(), Math.min(mRect.width(), mRect.height())/ 2, mBgPaint);

    }

}

完整版代码

小结

实现方式优缺点
elevation优点:自带功能实现简单 缺点:不可自定义颜色
CardView优点:自带功能实现简单 缺点:自带圆角不一定可适配所有需求
Textshadow优点:自带功能实现简单 缺点:只可在TextView中使用
layer优点:实现形式简单 缺点:效果一般
自定义实现优点:实现效果好可配置能力高 缺点:需要开发者自行开发

 

转自:https://www.jb51.net/article/252246.htm

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个搜索框,我们可以借助 EditText 的一些属性和方法,下面是一个详细的实现步骤: 1. 在布局文件中添加 EditText 控件: ```xml <EditText android:id="@+id/search_edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入搜索关键词" android:imeOptions="actionSearch" android:inputType="text" android:maxLines="1" /> ``` 在这个布局中,我们添加了一个 EditText 控件,设置了它的提示文本、输入类型、最大行数和输入法选项。 2. 在 Activity 或 Fragment 中获取 EditText 控件的引用: ```java EditText searchEditText = findViewById(R.id.search_edit_text); ``` 3. 监听 EditText 的输入事件,当用户点击软键盘上的搜索按钮时,执行搜索操作: ```java searchEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { String keyword = searchEditText.getText().toString(); // 执行搜索操作 return true; } return false; } }); ``` 在这个监听器中,我们判断用户是否点击了软键盘上的搜索按钮,如果是,则获取 EditText 中的搜索关键词,执行搜索操作。 4. 可选:添加清空按钮和实时搜索功能。 可以在 EditText 的右侧添加一个清空按钮,当用户点击时,清空搜索框的内容。另外,可以监听 EditText 的文本变化事件,在用户输入内容时实时搜索。 ```java // 清空按钮 searchEditText.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_clear, 0); searchEditText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (event.getX() >= searchEditText.getWidth() - searchEditText.getCompoundPaddingRight()) { searchEditText.setText(""); return true; } } return false; } }); // 实时搜索 searchEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String keyword = s.toString(); // 执行实时搜索操作 } @Override public void afterTextChanged(Editable s) { } }); ``` 在这段代码中,我们添加了一个清空按钮,并监听了它的触摸事件。另外,我们还添加了一个文本变化监听器,当用户输入内容时,执行实时搜索操作。 以上就是利用 EditText 实现搜索框的详细步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值