Android 全局悬浮按钮,悬浮按钮点击事件
生活随笔
收集整理的這篇文章主要介紹了
Android 全局悬浮按钮,悬浮按钮点击事件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
實現(xiàn)效果:
?
?
實現(xiàn)方法:
?在自定義baseActivity里面添加viwe即可。在子activity里刷新懸浮View即可
?
public abstract class BaseActivity extends BaseCommonActivity {LinearLayout saoli,ewmli;ImageView imageView;private QrCodeDialog mMQrCodeDialog;public static final int SECURITY_ACTIVITY_REQUEST_DD = 30008;//需要處理全屏邏輯之類的操作,在子類重寫beforeSetContentView方法做處理@Overrideprotected void beforeSetContentView() {super.beforeSetContentView();setTranslucentStatus();setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}//需要在每個Activity處理邏輯,直接在onCreate方法處理@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);createFloatActionButtons();ObServernotice.getInstance().addObserver(observer);}MyObserver observer = new MyObserver() {@Overridepublic void update(int id, int intparameter, final String string, Bitmap bitmap) {if (id==999){if (intparameter==0){saoli.setVisibility(View.GONE);ewmli.setVisibility(View.GONE);}else if (intparameter==1){saoli.setVisibility(View.VISIBLE);ewmli.setVisibility(View.VISIBLE);mMQrCodeDialog = new QrCodeDialog(BaseActivity.this) {@Overridepublic String setIvQrCode() {return QrActivity.QR_TAG_ORDER + string;}};imageView.setImageBitmap(bitmap);}}}};private void createFloatActionButtons() {View v = getWindow().getLayoutInflater().inflate(R.layout.layout_float_action_buttons, null);FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);layoutParams.gravity = Gravity.BOTTOM | Gravity.RIGHT;addContentView(v, layoutParams);saoli = findViewById(R.id.saoli);ewmli = findViewById(R.id.ewmli);imageView = findViewById(R.id.ddmaimg);initShowfloat();saoli.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {scan();}});ewmli.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mMQrCodeDialog != null) {mMQrCodeDialog.show();}}});}public void initShowfloat(){int ss = ShareUtil.getSharedInt("floatint");if (ss==1){saoli.setVisibility(View.VISIBLE);ewmli.setVisibility(View.VISIBLE);}else {saoli.setVisibility(View.GONE);ewmli.setVisibility(View.GONE);}final String ewmstring =ShareUtil.getSharedString("ewmss");if (!TextUtils.isEmpty(ewmstring)){Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode(QrActivity.QR_TAG_ORDER+ewmstring,BGAQRCodeUtil.dp2px(BaseActivity.this, ResUtil.getPx(R.dimen.normal_340dp)),ContextCompat.getColor(BaseActivity.this, R.color.black), null);mMQrCodeDialog = new QrCodeDialog(BaseActivity.this) {@Overridepublic String setIvQrCode() {return QrActivity.QR_TAG_ORDER + ewmstring;}};imageView.setImageBitmap(bitmap);}}private void scan() {startActivity(QrActivity.newIntent(this, 0));}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {PermissionUtil.getInstance(getApplicationContext()).onRequestPermissionsResult(requestCode, permissions, grantResults);super.onRequestPermissionsResult(requestCode, permissions, grantResults);}@Overrideprotected void onDestroy() {super.onDestroy();ObServernotice.getInstance().removeObserver(observer);observer = null;} }方法二:
machine_state_view文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><FrameLayoutandroid:background="@mipmap/ic_jxz"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone"android:layout_gravity="right|top"android:text="2"></TextView></FrameLayout> </RelativeLayout>?
AbstractDragFloatActionButton文件
/***meixi*/ public abstract class AbstractDragFloatActionButton extends RelativeLayout {private int parentHeight;//懸浮的父布局高度private int parentWidth;public AbstractDragFloatActionButton(Context context) {this(context, null, 0);}public AbstractDragFloatActionButton(Context context, AttributeSet attrs) {this(context, attrs, 0);}public abstract int getLayoutId();public abstract void renderView(View view);public AbstractDragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);View view= LayoutInflater.from(context).inflate(getLayoutId(), this);renderView(view);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {measureChildren(widthMeasureSpec, heightMeasureSpec);super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean b, int i, int i1, int i2, int i3) {View view = getChildAt(0);view.layout(0,0,view.getMeasuredWidth(),view.getMeasuredHeight());}private int lastX;private int lastY;private boolean isDrag;@Overridepublic boolean onTouchEvent(MotionEvent event) {int rawX = (int) event.getRawX();int rawY = (int) event.getRawY();switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:setPressed(true);//默認是點擊事件isDrag=false;//默認是非拖動而是點擊事件getParent().requestDisallowInterceptTouchEvent(true);//父布局不要攔截子布局的監(jiān)聽lastX=rawX;lastY=rawY;ViewGroup parent;if(getParent()!=null){parent= (ViewGroup) getParent();parentHeight=parent.getHeight();parentWidth=parent.getWidth();}break;case MotionEvent.ACTION_MOVE:isDrag = (parentHeight > 0 && parentWidth > 0);//只有父布局存在你才可以拖動if(!isDrag) break;int dx=rawX-lastX;int dy=rawY-lastY;//這里修復(fù)一些華為手機無法觸發(fā)點擊事件int distance= (int) Math.sqrt(dx*dx+dy*dy);isDrag = distance>0;//只有位移大于0說明拖動了if(!isDrag) break;float x=getX()+dx;float y=getY()+dy;//檢測是否到達邊緣 左上右下x=x<0?0:x>parentWidth-getWidth()?parentWidth-getWidth():x;y=y<0?0:y>parentHeight-getHeight()?parentHeight-getHeight():y;setX(x);setY(y);lastX=rawX;lastY=rawY;break;case MotionEvent.ACTION_UP://如果是拖動狀態(tài)下即非點擊按壓事件setPressed(!isDrag);break;}//如果不是拖拽,那么就不消費這個事件,以免影響點擊事件的處理//拖拽事件要自己消費return isDrag || super.onTouchEvent(event);}}?
MachineStateView文件:
public class MachineStateView extends AbstractDragFloatActionButton {public static final String TAG = MachineStateView.class.getSimpleName();public MachineStateView(Context context) {super(context);}public MachineStateView(Context context, AttributeSet attrs) {super(context, attrs);}public MachineStateView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic int getLayoutId() {return R.layout.machine_state_view;//拿到你自己定義的懸浮布局}@Overridepublic void renderView(View view) {//初始化那些布局Log.e(TAG,"MachineStateView" + view.getId());} }?
引用MachineStateView即可
?
?
實現(xiàn)demo:https://download.csdn.net/download/meixi_android/12568936
?
在線bug交流:扣1085220040
?
總結(jié)
以上是生活随笔為你收集整理的Android 全局悬浮按钮,悬浮按钮点击事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金字塔c_FPN特征金字塔网络解读
- 下一篇: Android 将图片网址url转化为b