因为项目需要一个右下角浮动的圆形的按钮,顺便增加了一个用户友好体验,点击按钮后开始转动,再次点击后停止转动,如图:
实现方式:
首先添加一个FABImageButton.java的类文件
package com.example.test;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.Resources;import android.content.res.TypedArray;import android.graphics.Color;import android.graphics.LinearGradient;import android.graphics.Shader;import android.graphics.drawable.Drawable;import android.graphics.drawable.LayerDrawable;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.StateListDrawable;import android.graphics.drawable.shapes.OvalShape;import android.util.AttributeSet;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.view.animation.LinearInterpolator;import android.widget.ImageButton;public class FABImageButton extends ImageButton{ private Context content; private Animation operatingAnim; private boolean isAnimPlay = false; private int bgColor; private int bgColorPressed; public FABImageButton(Context context) { super(context); this.content = context; init(null); } public FABImageButton(Context context, AttributeSet attrs) { super(context, attrs); this.content = context; init(attrs); } public FABImageButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.content = context; init(attrs); } @SuppressLint("NewApi") public FABImageButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); this.content = context; init(attrs); } /** * 播放/暂停旋转动画 * */ public void PlayAnim(){ if(!isAnimPlay){ startAnimation(operatingAnim); isAnimPlay = true; }else{ clearAnimation(); isAnimPlay = false; } } private Drawable createButton(int color) { OvalShape oShape = new OvalShape(); ShapeDrawable sd = new ShapeDrawable(oShape); setWillNotDraw(false); sd.getPaint().setColor(color); ShapeDrawable sd1 = new ShapeDrawable(oShape); sd1.setShaderFactory(new ShapeDrawable.ShaderFactory() { @Override public Shader resize(int width, int height) { LinearGradient lg = new LinearGradient(0,0,0, height, new int[] { Color.WHITE, Color.GRAY, Color.DKGRAY, Color.BLACK }, null, Shader.TileMode.REPEAT); return lg; } }); LayerDrawable ld = new LayerDrawable(new Drawable[] { sd1, sd }); ld.setLayerInset(0, 0, 0, 0, 0); return ld; } @SuppressLint("NewApi") private void init(AttributeSet attrSet) { //加载动画 operatingAnim = AnimationUtils.loadAnimation(content, R.anim.tip); LinearInterpolator lin = new LinearInterpolator(); operatingAnim.setInterpolator(lin); Resources.Theme theme = content.getTheme(); TypedArray arr = theme.obtainStyledAttributes(attrSet, R.styleable.FAB, 0, 0); try { setBgColor(arr.getColor(R.styleable.FAB_bg_color, Color.BLACK)); setBgColorPressed(arr.getColor(R.styleable.FAB_bg_color_pressed, Color.GRAY)); StateListDrawable sld = new StateListDrawable(); sld.addState(new int[] {android.R.attr.state_pressed}, createButton(bgColorPressed)); sld.addState(new int[] {}, createButton(bgColor)); setBackground(sld); } catch(Throwable t) {} finally { arr.recycle(); } } public void setBgColor(int color) { this.bgColor = color; } public void setBgColorPressed(int color) { this.bgColorPressed = color; }}
2. values文件夹下面定义个名称为stylable.xml的资源文件
3.创建一个旋转的动画效果res文件夹下面建立一个anim文件夹,在文件夹下面建立一个名称为tip.xml的xml文件
4.layout里面添加FABImageButton
5.MainActivity文件
public class MainActivity extends Activity { FABImageButton fabbtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv = (ListView) findViewById(R.id.lv1); String[] data = new String[100]; for (int i=0; i < data.length; i++) data[i] = "浮动按钮" + i; ArrayAdapteraAdpt = new ArrayAdapter (this, android.R.layout.simple_list_item_1, data); lv.setAdapter(aAdpt); fabbtn = (FABImageButton) findViewById(R.id.fabbtn); fabbtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { fabbtn.PlayAnim(); } }); }}
结束...