如何为前棒棒糖创建涟漪效果
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页面)在涟漪效果完成之前打开,如何解决? 哪个涟漪?使用此代码,您将无法在棒棒糖之前获得它!以上是关于如何为前棒棒糖创建涟漪效果的主要内容,如果未能解决你的问题,请参考以下文章
用于 Pre-Lollipop 设备的具有弯曲背景的 Android Ripple 按钮