• Android


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

    实现方式:

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

      

    结束...

    ------------------------------
    Brant Liu

    lbf1988@qq.com

    有梦想的码农
  • 相关阅读:
    [Python 多线程] Concurrent (十五)
    [Python 多线程] GIL全局解释器锁 (十三)
    [Python 多线程] Semaphore、BounedeSemaphore (十二)
    自定义HandlerMethodArgumentResolver参数解析器和源码分析
    Dubbo分布式日志追踪
    kafka的分区分配策略
    深入剖析kafka架构内部原理
    kafka partition(分区)与 group
    Kafka消费组(consumer group)
    kafka存储机制以及offset
  • 原文地址:https://www.cnblogs.com/brantliu/p/4878882.html
Copyright © 2020-2023  润新知