码迷,mamicode.com
首页 > 移动开发 > 详细

Android - 点击可以转动的自定义右下角浮动FABImageButton按钮

时间:2015-10-14 23:31:01      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

因为项目需要一个右下角浮动的圆形的按钮,顺便增加了一个用户友好体验,点击按钮后开始转动,再次点击后停止转动,如图:

技术分享

实现方式:

首先添加一个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的资源文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="FAB">
        <!-- Background color -->
        <attr name="bg_color" format="color|reference"/>
        <attr name="bg_color_pressed" format="color|reference"/>
    </declare-styleable>
</resources>

 

3.创建一个旋转的动画效果res文件夹下面建立一个anim文件夹,在文件夹下面建立一个名称为tip.xml的xml文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <rotate
        android:duration="200"  //转动速度
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="-1"
        android:toDegrees="359" />
</set>

 

4.layout里面添加FABImageButton

<com.example.test.FABImageButton
	android:id="@+id/fabbtn"
	android:layout_width="30dp"
        android:layout_height="30dp"
        android:src="@android:drawable/ic_input_add"   
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="16dp"
        android:tint="@android:color/white"/>

 

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;

        ArrayAdapter<String> aAdpt = new ArrayAdapter<String>(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();
			}
        });
    }
}

  

结束...

 

Android - 点击可以转动的自定义右下角浮动FABImageButton按钮

标签:

原文地址:http://www.cnblogs.com/brantliu/p/4878882.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!