RippleDrawable

public class

RippleDrawable                                      Added in API level 21

extends  LayerDrawable
java.lang.Object
   ↳ android.graphics.drawable.Drawable
     ↳ android.graphics.drawable.LayerDrawable
       ↳ android.graphics.drawable.RippleDrawable




可以使用系统的默认效果

?android:attr/selectableItemBackground (有界波纹)

?android:attr/selectableItemBackgroundBorderless (无界波纹)



这两个属性对应(在themes_material.xml里)
 @drawable/item_background_material@drawable/item_background_borderless_material

item_background_borderless_material.xml



item_background_borderless_material_dark.xml


item_background_borderless_material_light.xml


item_background_material.xml



item_background_material_dark.xml




item_background_material_light.xml


按照上面的格式

 




这个是有边界的








这是一个无边界的





 ripple里有个radius 属性,表示波纹的中心点就在以View中心点为圆心,radius为半径的圆内










练习:

布局文件








res/layout/circular_button_layout.xml.xml





res/drawable/circular_button.xml







res/drawable/circular_button_ripple_selector.xml







res/drawable/circular_button_selector.xml



res/drawable/circular_button_selected.xml






res/anim/button_elevation.xml





/*** API 21* */
public class RippleDrawableActivity extends AppCompatActivity implements View.OnTouchListener{private ViewGroup buttonsContainer;private ViewGroup activeButton = null;private final int MAX_BUTTONS = 3;private class  CircleOutLineProvider extends ViewOutlineProvider{@Overridepublic void getOutline(View view, Outline outline) {outline.setOval(0,0,view.getWidth(),view.getHeight());}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_ripple_drawable);this.buttonsContainer = (ViewGroup) findViewById(R.id.buttonsContainer);int buttonsSpacing = (int) getResources().getDimension(R.dimen.activity_horizontal_margin);int buttonSize = (int) getResources().getDimension(R.dimen.button_size);CircleOutLineProvider circleOutLineProvider = new CircleOutLineProvider();// Outline circularOutline = new Outline();// circularOutline.setOval(0, 0, buttonSize, buttonSize);for (int i = 0; i < MAX_BUTTONS; i++) {ViewGroup buttonHost = (ViewGroup) getLayoutInflater().inflate(R.layout.circular_button_layout, buttonsContainer, false);TextView button = (TextView) buttonHost.getChildAt(0);buttonHost.setClipToOutline(true);buttonHost.setOutlineProvider(circleOutLineProvider);button.setText("Test " + i);buttonHost.setOnTouchListener(this);buttonsContainer.addView(buttonHost);//Add margin between buttons manuallyif (i != MAX_BUTTONS - 1) {buttonsContainer.addView(new Space(this), new ViewGroup.LayoutParams(buttonsSpacing, buttonSize));}}selectButton(((ViewGroup) buttonsContainer.getChildAt(0)), false);}private void selectButton(ViewGroup buttonHost, boolean reveal) {selectButton(buttonHost, reveal, buttonHost.getWidth(), buttonHost.getHeight());}private void selectButton(ViewGroup buttonHost, boolean reveal, int startX, int startY) {if (buttonHost == activeButton) {return;}if (activeButton != null) {activeButton.setSelected(false);activeButton = null;}activeButton = buttonHost;activeButton.setSelected(true);View button = activeButton.getChildAt(0);if (reveal) {//API 21ViewAnimationUtils.createCircularReveal(button,startX,startY,0,button.getHeight()).start();}}@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()) {case MotionEvent.ACTION_DOWN:((ViewGroup) view).getChildAt(0).getBackground().setHotspot(motionEvent.getX(), motionEvent.getY());break;case MotionEvent.ACTION_UP:selectButton((ViewGroup) view, true, (int) motionEvent.getX(), (int) motionEvent.getY());break;}return false;}
}









参考:http://trickyandroid.com/simple-ripple-reveal-elevation-tutorial/




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部