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

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

实现方式:

首先添加一个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();
			}
        });
    }
}

  

结束...

时间: 10-14

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

Android点击事件的四种写法

Android点击事件的四种写法 一.Android点击事件的四种写法 1.点击事件的第一种写法 .  写一个内部类.实现点击事件的接口 bt.setOnClickListener(new MyButtonListener()); 2.点击事件的第二种写法,匿名内部类 bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { callPhone(); } }); 3.点击事件的第三种

Android点击返回键back时弹出对话框Dialog

public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { ExitDialog(MainActivity.this).show(); return true; } return super.onKeyDown(keyCode, event); } private Dialog ExitDialog

android :点击某个按钮弹出在原有布局中没有(或者存在)内容 :以删除原有布局内容为例

主要涉及了(1)对布局中某个控件的监听 (2)在布局文件中设置可显示,删除的参数 visibility的参数的有三个,在这里我只设置了一个,可见的. android:visibility="visible" 剩下的和他的用法相同. (3)在代码中监听控件后,对visibility的参数重新设置. 效果图:点击按钮后edittext不见了 (1)点击高级按钮前 (2)点击高级按钮后 (1)布局文件 <?xml version="1.0" encoding=&qu

【转】Android点击空白区域,隐藏输入法软键盘

原文网址:http://www.2cto.com/kf/201505/401382.html 很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏.为了更好的体验,我们可以实现当用户使用完毕软键盘时.点击空白区域即可实现隐藏的功能.效果如图所示: 代码实现 代码块语法遵循标准markdown代码,例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Android点击效果

我们在开发网站时,会发现当我们添加<a/>标签后,标签有一个点击效果,比如颜色变化,这样开看起来用户体验会很棒,那么在我们的Android开发中如何加入这样的效果呢?本篇就为大家揭开它的神秘面纱. 既然是点击事件的变化,我们就要监控用户是否点击,这里我有两种实现方式:1.通过改变背景图片达到上述效果:2.通过改变背景颜色来达到上述效果. 两者各有千秋,比如当我们设计按钮(Button)的点击事件时,建议使用第一种:而当我们设计诸如Item时,建议使用第二种.好了下面开始为大家进行代码分析: 首

android 1.6 launcher研究之自定义ViewGroup (转 2011.06.03(二)——— android 1.6 launcher研究之自定义ViewGroup )

2011.06.03(2)——— android 1.6 launcher研究之自定义ViewGroup2011.06.03(2)——— android 1.6 launcher研究之自定义ViewGroup 1.用xml来作为ViewGroup里面的View参考:http://www.eoeandroid.com/thread-30888-1-1.html MyViewGroup.java package com.lp; import android.content.Context; impo

Android View体系(十一)自定义ViewGroup

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Scroller Android View体系(五)从源码解析View的事件分发机制 Android View体系(六)从源码解析Activity的构成 Android View体系(七)从源码解析View的measure流程 Android View体系(八)从源码解析View的layout

android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序 在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, 结果总是存在好几个同样的activity,就算要返回的activity正在前台,点击消息后也会重新打开一个一样的activity,返回好几次才能退出, 而不能像qq之类的点击通知栏消息回到之前存在的activity,如果存在就不再新建一个activity 说的有点绕,如果是遇到此类问题的肯定能懂,没遇到

android源码分析 android toast使用详解 toast自定义

在安卓开发过程中,toast使我们经常使用的一个类,当我们需要向用户传达一些信息,但是不需要和用户交互时,该方式就是一种十分恰当的途径. 我们习惯了这样使用toast:Toast.makeText(Context context, String info, int duration).show();该方法是 系统为我们提供的一个方便的创建toast对象的静态方法,其内部依然是调用toast的相关方法完成.下面 就从其源码对该类的实现做一个分析 在toast类中,最重要的用于显示该toast的sh