如何为前棒棒糖创建涟漪效果

Posted

技术标签:

【中文标题】如何为前棒棒糖创建涟漪效果【英文标题】:how to create ripple effect for pre-lollipop 【发布时间】:2015-08-25 23:16:40 【问题描述】:

如何应用像this这样的涟漪效果

我已将依赖项放在 app/build.gradle 中

app/build.gradle

dependencies 
    compile 'com.github.traex.rippleeffect:library:1.3'

build.gradle

allprojects
    repositories
        jcenter()
        maven(url "https://jitpack.io" 

XML 文件:

<com.andexert.library.RippleView
        android:id="@+id/rect1"
        android:layout_
        android:layout_>
  <Button
      android:id="@+id/enterButton"
      android:layout_
      android:layout_
      android:text="Save your user name" />
 </com.andexert.library.RippleView>

Java 类文件

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.save_user);
    editText=(EditText) findViewById(R.id.userNameEditText);
    button=(Button) findViewById(R.id.enterButton);

    sharedPreferences=getSharedPreferences(SHARED_NAME_STRING, MODE_PRIVATE);
    String userNameString=sharedPreferences.getString(USER_NAME_STRING, "");

    editText.setText(userNameString);

    button.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View v) 
            String string=editText.getText().toString();
            Intent intent=new Intent(SaveUser.this, MainActivity.class);
            intent.putExtra("user", string);

            SharedPreferences.Editor editor=sharedPreferences.edit();
            editor.putString(USER_NAME_STRING, string);
            editor.commit();

            startActivity(intent);

        
    );

它有效,但我的问题是在涟漪效果完成之前打开另一个活动,当我按下返回按钮时,剩余的涟漪完成。怎么解决??

【问题讨论】:

【参考方案1】:

对于棒棒糖(API>21),在drawable-v21中将文件制作为btn_ripple_effect.xml并放在下面的代码

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

    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:color="?android:colorAccent"
        tools:targetApi="lollipop">
        <item android:drawable="@color/cancel_btn_clr" /> <!-- default -->
        <item android:id="@android:id/mask">
            <shape android:shape="rectangle">
                <solid android:color="?android:colorAccent" />
            </shape>
        </item>
    </ripple>

对于 pre lollipop (API

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/colorAccent"></solid>
        </shape>
    </item>

    <item>
        <shape>
            <solid android:color="@color/cancel_btn_clr"></solid>
        </shape>
    </item>
</selector>

如下创建按钮

<Button
                    android:id="@+id/button3"
                    style="@style/cancel_btn_style"
                    android:layout_marginLeft="50dp"
                    android:text="Cancel"
                    />

在你的 style.xml 中添加这个

          <style name="cancel_btn_style" parent="Theme.AppCompat">
<item name="android:textSize">15sp</item>
<item name="android:textColor">#ffffff</item>
<item name="android:layout_height">36dp</item>
<item name="android:layout_width">90dp</item>
<item name="android:background">@drawable/btn_ripple_effect</item>

【讨论】:

对于棒棒糖之前的设备,btn_ripple_effect.xml 中的父标签是什么? @RohitSingh 它应该是一个选择器 这个解决方案不需要外部依赖,所以它是一个更好的答案 它甚至没有产生涟漪效果,只是背景发生了变化【参考方案2】:

你可以试试这个库balysv/material-ripple。

在你的 gradle 中,添加这一行:

compile 'com.balysv:material-ripple:1.0.2'

这是怎么做的:

<com.balysv.materialripple.MaterialRippleLayout
android:id="@+id/ripple"
android:layout_
android:layout_>

<Button
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:text="Button inside a ripple"/>
</com.balysv.materialripple.MaterialRippleLayout>

【讨论】:

SDK 8 可以完美使用,在库的描述中,搜索 Support for Android api versions LinearLayout 应该是 MaterialRippleLayout 的父级。 这不是一个好主意,因为它可以支持xml 一侧的一个孩子。想想如果你想为 100 个按钮做这个,你会发生什么!显然它不能支持做波纹的java代码。我用button 对其进行了测试,但我不能得到很好的结果。【参考方案3】:

对于棒棒糖(API>21),在drawable-v21中将文件制作为btn_ripple_effect.xml并放在下面的代码

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#f8c7c9c8"
    tools:targetApi="lollipop">

    <item android:id="@android:id/mask">

        <shape android:shape="oval">
            <corners android:radius="@dimen/dp10" />
            <solid android:color="#f8ced6d2" />

        </shape>
    </item>
</ripple>

对于 pre lollipop (API

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="#f8ced6d2"/>
        </shape>
    </item>

    <item>
        <shape>
            <solid android:color="@color/transparent"/>
        </shape>
    </item>
</selector>

像这样在 imageview 上使用它

<ImageView
  android:id="@+id/imageViewOffer"
  android:layout_
  android:layout_
  android:layout_centerVertical="true"
  android:background="@drawable/btn_ripple_effect"
  android:src="@mipmap/ic_offers"/>

【讨论】:

这不是连锁反应【参考方案4】:

我知道这很旧,但您可以在库提供的 onRippleCompleteListener 中执行您的操作。 类似的东西:

rippleView.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() 

@Override
public void onComplete(RippleView rippleView) 
//Your code here...

);

希望这会有所帮助。 :)

【讨论】:

【参考方案5】:

使用 appcompat 库

com.android.support:appcompat-v7:22.1.1

扩展“Base.TextAppearance.AppCompat.Button”

<style name="BrowseContentButton" parent="Base.TextAppearance.AppCompat.Button">
    <item name="android:textColor">@color/grey_0</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">48dp</item>
</style>

应用样式

 <Button
        android:id="@+id/browseMultimedia"
        style="@style/BrowseContentButton"
        android:layout_below="@id/browseGuidelines"
        android:layout_toRightOf="@+id/divider"
        android:text="@string/browse_multimedia"
        />

【讨论】:

所有这些工作,但我的问题是在涟漪效果完成之前打开另一个活动,当我按下返回按钮时,剩余的涟漪完成。我该如何解决?? 我已经上传了上面的java文件,也有xml文件和依赖项,但是当点击按钮时,另一个页面(SaveUser页面)在涟漪效果完成之前打开,如何解决? 哪个涟漪?使用此代码,您将无法在棒棒糖之前获得它!

以上是关于如何为前棒棒糖创建涟漪效果的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用长按棒棒糖中的按钮时的涟漪效应?

带有波纹动画的Android自定义视图边缘裁剪

用于 Pre-Lollipop 设备的具有弯曲背景的 Android Ripple 按钮

我刚开始使用 Elementor for WordPress,我想知道如何为标题创建淡入/淡出下划线效果

如何为数据增强创建噪声图像

如何为本地 wordpress 创建 XAMPP 登录