【问题标题】: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_width="match_parent"
        android:layout_height="wrap_content">
  <Button
      android:id="@+id/enterButton"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      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);

        }
    });
}

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

【问题讨论】:

    标签: android rippledrawable


    【解决方案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_width="match_parent"
    android:layout_height="wrap_content">
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        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_width="wrap_content"
      android:layout_height="wrap_content"
      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页面)在涟漪效果完成之前打开,如何解决?
      • 哪个涟漪?使用此代码,您将无法在棒棒糖之前获得它!
      猜你喜欢
      • 1970-01-01
      • 2016-02-25
      • 2016-02-04
      • 2015-09-24
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2015-08-12
      相关资源
      最近更新 更多