android如何让2个button无限靠近
Android的Button按钮,ACTION_UP事件不触发解决方案

Android的Button按钮,ACTION_UP事件不触发解决⽅案在android 编程时,有时候要实现当Button⼀直按下的时候,执⾏⼀些逻辑代码,当按钮弹起的时候,终⽌这些逻辑代码的执⾏。
⽐如在设置页⾯的滑动开关时,如果不监听ACTION_CANCEL,在滑动到中间时,如果你⼿指上下移动,就是移动到开关控件之外,就会造成开关的按钮停顿在中间位置。
在⼀般情况下,实现这个逻辑需要注册OnTouchListener监听,OnTouchListener的OnTouch⽅法中代码如下:switch (event.getAction()) {case MotionEvent.ACTION_DOWN://按钮按下逻辑break;case MotionEvent.ACTION_UP://按钮弹起逻辑break;}在⼀般情况下,这样写是没有问题的,但是当⼿指快速滑过这个Button时,就会发现只触发了ACTION_DOWN时间,没有触发ACTION_UP,就会导致,按钮按下的逻辑代码⼀直会执⾏。
当焦点移动到件之外,此时会触发ACTION_CANCEL,⽽不是ACTION_UP,造成按下的逻辑⼀直会执⾏。
为了解决这个问题,上述代码可以需要修改为:switch (event.getAction()) {case MotionEvent.ACTION_DOWN://按钮按下逻辑break;case MotionEvent.ACTION_UP://按钮弹起逻辑break;case MotionEvent.ACTION_CANCEL://按钮弹起逻辑break;}ACTION_UP处理的是在Button原位置弹起,ACTION_CANCEL处理的是焦点离开Button,两者都需要处理,才能解决这个问题。
⽰例(我这个是在按下的时候,让按钮放⼤,⼿抬起的时候缩⼩操作):login_with_sina.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:System.out.println("++++++key_down");AnimUtil.showOnFocusAnimation(login_with_sina);break;case MotionEvent.ACTION_UP:System.out.println("++++++key_down");AnimUtil.showLooseFocusAinimation(login_with_sina);break;case MotionEvent.ACTION_CANCEL:System.out.println("++++++key_down");AnimUtil.showLooseFocusAinimation(login_with_sina);break;}return true;}});。
Android手机开发使用线性布局和相对布局实现Button垂直水平居中

Android⼿机开发使⽤线性布局和相对布局实现Button垂直⽔平居中居中呢,这⾥分两种不同布局⽅式的居中!分别是 LinearLayout 和RelativeLayout。
⼀、⾸先说的是LinearLayout布局下的居中:注意:android:layout_width="fill_parent" android:layout_height="fill_parent" 属性中,若⽔平居中,⾄少在宽度上占全屏;若垂直居中,则在⾼度上占全屏<LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center|center_horizontal|center_vertical" >// 上⾯gravity属性的参数:center为居中,center_horizontal为⽔平居中,center_vertical为垂直居中<Buttonandroid:id="@+id/Binding_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="关联新账户" /></LinearLayout>⼆、然后说的是RelativeLayout布局下的居中:<RelativeLayout xmlns:Android="/apk/res/android"Android:layout_width="fill_parent" Android:layout_height="fill_parent"><Button Android:id="@+id/btngal" Android:layout_width="wrap_content"Android:layout_height="wrap_content" Android:gravity="center_horizontal"Android:textSize="20sp" Android:layout_alignParentBottom="true"Android:layout_centerHorizontal="true" Android:text="返回主界⾯" /></RelativeLayout>简单说明Android:gravity="CENTER_VERTICAL“:这个是垂直居中对齐Android:gravity="BOTTOM”:放在容器的底部Android:gravity="CENTER“ :放在容器的中⼼三、⼀⾏居中两个按钮的⽅法⽅法1:<LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"style="@android:style/ButtonBar"><Button android:id="@+id/btn_listview"android:layout_height="wrap_content"android:layout_width="0dp"android:layout_weight="1"android:text="ListView"/><Button android:id="@+id/btn_emptyview"android:layout_height="wrap_content"android:layout_width="0dp"android:layout_weight="1"android:text="EmptyView"/></LinearLayout>⽅法2:<RelativeLayout android:id="@+id/relativeTop"android:layout_width="fill_parent" android:layout_height="wrap_content"android:layout_centerHorizontal="true" ><Buttonandroid:id="@+id/btnGetMp3s"android:text="@string/strGetMp3List"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:layout_toLeftOf="@id/txtHide" /><TextView android:id="@+id/txtHide" android:layout_width="25" android:layout_height="1" android:layout_centerHorizontal="true" /><Buttonandroid:id="@+id/btnExitSys"android:text="@string/strExitSys"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toRightOf="@id/txtHide" /></RelativeLayout>。
Android开发悬浮按钮FloatingActionButton的实现方法

Android开发悬浮按钮FloatingActionButton的实现⽅法⼀、介绍这个类是继承⾃ImageView的,所以对于这个控件我们可以使⽤ImageView的所有属性android.support.design.widget.FloatingActionButton⼆、使⽤准备,在as 的 build.grade⽂件中写上compile 'com.android.support:design:22.2.0'三、使⽤说明xml⽂件中,注意蓝⾊字体部分<android.support.design.widget.FloatingActionButtonandroid:id="@+id/floatingActionButton"android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_centerInParent="true"android:src="@mipmap/ok"app:borderWidth="0dp"app:backgroundTint="#FF4011"app:rippleColor="#33728dff"app:elevation="8dp"app:pressedTranslationZ="16dp"/>可以看到我们使⽤了app属性,则需要在根容器中添加这个属性。
xmlns:app="/apk/res-auto"属性介绍:1、app:borderWidth=""------------------边框宽度,通常设置为0 ,⽤于解决Android 5.X设备上阴影⽆法正常显⽰的问题2、app:backgroundTint=""---------------按钮的背景颜⾊,不设置,默认使⽤theme中colorAccent的颜⾊3、app:rippleColor=""--------------------点击的边缘阴影颜⾊4、app:elevation=""----------------------边缘阴影的宽度5、app:pressedTranslationZ="16dp"-----点击按钮时,按钮边缘阴影的宽度,通常设置⽐elevation的数值⼤另外我们希望点击按钮⼀个颜⾊,正常状态⼀个颜⾊以提⾼⽤户体验,那么就是drawable⽂件夹中创建⽂件 floatbutton.xml <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android"><item android:drawable="@color/colorNormal"></item><item android:state_pressed="true" android:drawable="@color/colorPressed"></item></selector>然后我们设置FloatActionButton的backgroud为这个drawable⽂件即可,同时app:backgroundTint=""属性也可以不再设置<android.support.design.widget.FloatingActionButtonandroid:id="@+id/floatingActionButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:background="@drawable/floatbutton"android:src="@mipmap/ok"app:borderWidth="0dp"app:rippleColor="#33728dff"app:elevation="8dp"app:pressedTranslationZ="16dp"/>效果图:。
Android实现圆角Button按钮

Android实现圆⾓Button按钮本⽂实例讲述了Android开发圆⾓Button按钮实现过程,分享给⼤家供⼤家参考,具体内容如下需求及效果图:实现思路:1、shape实现圆⾓在drawable新建两个xml ⽂件, 这两个 xml⽂件⽤shape 实现了圆⾓效果。
Note:因为要让⽤户有按下去的效果体验, 所有要有两套圆⾓图, 在按下去时候切换<!-- res/drawable/button_shape_normal.xml --><shape xmlns:android="/apk/res/android"android:shape="rectangle" ><!-- rounded corner --><corners android:radius="5dp" /><solid android:color="@color/orange_normal" /></shape><!-- res/drawable/button_shape_pressed.xml --><shape xmlns:android="/apk/res/android"android:shape="rectangle" ><!-- rounded corner --><corners android:radius="5dp" /><!-- fill with two colors, and the two colors change softly --><!--<gradientandroid:angle="270"android:startColor="@color/orange_light"android:endColor="@color/orange_normal"android:useLevel="true" />--><solid android:color="@color/orange_light" /></shape>2、selector实现按下效果在 drawable 新建⼀个 xml ⽂件, ⽤ selector 把刚才建⽴的两个 xml ⽂件组织起来<!-- res/drawable/button_shape.xml --><selector xmlns:android="/apk/res/android"><item android:drawable="@drawable/button_shape_normal" android:state_pressed="false"/><item android:drawable="@drawable/button_shape_pressed" android:state_pressed="true"/></selector>3、style实现多个按钮复⽤在res/values/styles.xml ⾥⾯输⼊下⾯代码<style name="SmsButton"><item name="android:layout_width">0dp</item><item name="android:layout_weight">1</item><item name="android:layout_height">wrap_content</item><item name="android:textSize">20sp</item><item name="android:background">@drawable/button_shape</item><item name="android:textColor">@color/white</item></style>4、引⽤圆⾓按钮在 layout/fragment_bomb.xml ⾥⾯⽤ style 引⽤<Buttonandroid:id="@+id/fireup"style="@style/SmsButton"android:layout_marginEnd="20dp"android:layout_marginStart="20dp"android:text="@string/fireup" />可以省去建⽴style的步骤, 直接在layout⾥⾯引⽤即可。
Android实现悬浮可拖拽的Button

Android实现悬浮可拖拽的Button本⽂实例为⼤家分享了Android实现悬浮可拖拽Button的具体代码,供⼤家参考,具体内容如下1、简介最近,因为项⽬需要,需要制作⼀个界⾯上可拖拽的按钮,⽹上也有多实例,看了下⼤部分都是⽰例不全或讲解不清晰,效果图也不明显,借此⾃⼰记录⼀番⾃⼰的实现⽅案,以备不时之需,同时也为⼴⼤学者可以直接通过拷贝⽅式完成项⽬所需。
2、效果图在开始代码之前,⾸先看看效果图,如下:3、核⼼代码实现3.1 DraggingButton 实现public class DraggingButton extends android.support.v7.widget.AppCompatButton {private int lastX = 0;private int lastY = 0;private int beginX = 0;private int beginY = 0;private int screenWidth = 720;private int screenHeight = 1280;public DraggingButton(Context context) {this(context, null);}public DraggingButton(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public DraggingButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initData(context);}private void initData(Context context){WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);screenWidth = dm.widthPixels;screenHeight = dm.heightPixels;}@Overridepublic boolean onTouchEvent(MotionEvent event){switch (event.getAction()){case MotionEvent.ACTION_DOWN:lastX = (int) event.getRawX(); // 触摸点与屏幕左边的距离lastY = (int) event.getRawY(); // 触摸点与屏幕上边的距离beginX = lastX;beginY = lastY;break;case MotionEvent.ACTION_MOVE:int dx =(int)event.getRawX() - lastX; // x轴拖动的绝对距离int dy =(int)event.getRawY() - lastY; // y轴拖动的绝对距离// getLeft(): ⼦View的左边界到⽗View的左边界的距离, getRight():⼦View的右边界到⽗View的左边界的距离// 如下⼏个数据表⽰view应该在布局中的位置int left = getLeft() + dx;int top = getTop() + dy;int right = getRight() + dx;int bottom = getBottom() + dy;if(left < 0){left = 0;right = left + getWidth();}if(right > screenWidth){right = screenWidth;left = right - getWidth();}if(top < 0){top = 0;bottom = top + getHeight();}if(bottom>screenHeight){bottom = screenHeight;top = bottom - getHeight();}layout(left, top, right, bottom);lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:// 解决拖拽的时候松⼿点击事件触发if (Math.abs(lastX - beginX) < 10 && Math.abs(lastY - beginY) < 10){return super.onTouchEvent(event);}else{setPressed(false);return true;}default:break;}return super.onTouchEvent(event);}}核⼼代码已经奉献,通过⾃定义的DraggingButton即可实现可拖拽功能,具体原理主要在于onTouchEvent和layout两个函数的使⽤,具体细节不在讲述,代码注释⽐较清晰。
Android自定义Button按钮

Android自定义Button按钮Android自定义Button按钮主要可以分成两种形式:1.通过自定MyButton类来继承Button,将所有效果在类中实现.2.通过xml文件来改变Button的样式和颜色.今天我就先讲通过xml文件,稍后封装自定义Button类再补上.TestcActivity[html]package com.example.blueapp;nimport android.app.Activity;nimport android.os.Bundle;npublic class TestcActivity extends Activity {nnnn @Overridennnn protected void onCreate(Bundle savedInstanceState) {nnnnnnnn // TODO Auto-generated method stubnnnnnnnn super.onCreate(savedInstanceState);nnnnnnnn setContentView(yout.testc);nnnn }n}npackage com.example.blueapp;import android.app.Activity;import android.os.Bundle;public class TestcActivity extends Activity {n@Overridenprotected void onCreate(Bundle savedInstanceState) {nn// TODO Auto-generated method stubnnsuper.onCreate(savedInstanceState);nnsetContentView(yout.testc);n}}testc.xml[html]<?xml version="1.0" encoding="utf-8"?>n<LinearLayout xmlns:android="/apk/res/android"nnnn android:layout_width="match_parent"nnnn android:layout_height="match_parent"nnnn android:orientation="vertical" >nnnnnnnnn <Buttonnnnnnnnnn android:layout_width="fill_parent"nnnnnnnn android:layout_height="wrap_content"nnnnnnnn android:textSize="20dp"nnnnnnnn android:text="测试按钮"nnnnnnnn android:background="@drawable/button_style"nnnnnnnn />nnnnnnnnn <Buttonnnnnnnnnn android:layout_width="fill_parent"nnnnnnnn android:layout_height="wrap_content"nnnnnnnn android:textSize="20dp"nnnnnnnn android:text="原始按钮"nnnnnnnn />n</LinearLayout>n<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"nnn android:layout_width="match_parent"nnn android:layout_height="match_parent"nnn android:orientation="vertical" >nnnnnn <Buttonnnnnnnn android:layout_width="fill_parent"nnnnnnn android:layout_height="wrap_content"nnnnnnn android:textSize="20dp"nnnnnnn android:text="测试按钮"nnnnnnn android:background="@drawable/button_style"nnnnnnn />nnnnnn <Buttonnnnnnnn android:layout_width="fill_parent"nnnnnnn android:layout_height="wrap_content"nnnnnnn android:textSize="20dp"nnnnnnn android:text="原始按钮"nnnnnnn /></LinearLayout>button_style.xml[html]<?xml version="1.0" encoding="utf-8"?>nnn<selector xmlns:android="/apk/res/android">nnnnnn <item android:state_pressed="true">nnnnnnnnnn <shape>nnnnnnnnnnnnnn <gradient android:startColor="#0d76e1" android:endColor="#0d76e1"nn nnnnnnnnnnnnnnnn android:angle="270" />nnnnnnnnnnnnnn <stroke android:width="1dip" android:color="#f403c9" />nnnnnnnnnnnnnn <corners android:radius="2dp" />nnnnnnnnnnnnnn <padding android:left="10dp" android:top="10dp"nnnnnnnnnnnnnnnnnn android:right="10dp" android:bottom="10dp" />nnnnnnnnnn </shape>nnnnnn </item>nnnnnnnnnn <item android:state_focused="true">nnnnnnnnnn <shape>nnnnnnnnnnnnnn <gradient android:startColor="#ffc2b7" android:endColor="#ffc2b7"nn nnnnnnnnnnnnnnnn android:angle="270" />nnnnnnnnnnnnnn <stroke android:width="1dip" android:color="#f403c9" />nnnnnnnnnnnnnn <corners android:radius="2dp" />nnnnnnnnnnnnnn <padding android:left="10dp" android:top="10dp"nnnnnnnnnnnnnnnnnn android:right="10dp" android:bottom="10dp" />nnnnnnnnnn </shape>nnnnnn </item>nnnnnnnnnn <item>nnnnnnnnnn <shape>nnnnnnnnnnnnnn <gradient android:startColor="#000000" android:endColor="#ffffff"nn nnnnnnnnnnnnnnnn android:angle="180" />nnnnnnnnnnnnnn <stroke android:width="1dip" android:color="#f403c9" />nnnnnnnnnnnnnn <corners android:radius="5dip" />nnnnnnnnnnnnnn <padding android:left="10dp" android:top="10dp"nnnnnnnnnnnnnnnnnn android:right="10dp" android:bottom="10dp" />nnnnnnnnnn </shape>nnnnnn </item>nnn</selector>nnn<?xml version="1.0" encoding="utf-8"?>n<selector xmlns:android="/apk/res/android">nnnn <item android:state_pressed="true">nnnnnnnn <shape>nnnnnnnnnnnn <gradient android:startColor="#0d76e1" android:endColor="#0d76e1" nnnnnnnnnnnnnnnn android:angle="270" />nnnnnnnnnnnn <stroke android:width="1dip" android:color="#f403c9" />nnnnnnnnnnnn <corners android:radius="2dp" />nnnnnnnnnnnn <padding android:left="10dp" android:top="10dp"nnnnnnnnnnnnnnnn android:right="10dp" android:bottom="10dp" />nnnnnnnn </shape>nnnn </item>nnnnnn <item android:state_focused="true">nnnnnnnn <shape>nnnnnnnnnnnn <gradient android:startColor="#ffc2b7" android:endColor="#ffc2b7" nnnnnnnnnnnnnnnn android:angle="270" />nnnnnnnnnnnn <stroke android:width="1dip" android:color="#f403c9" />nnnnnnnnnnnn <corners android:radius="2dp" />nnnnnnnnnnnn <padding android:left="10dp" android:top="10dp"nnnnnnnnnnnnnnnn android:right="10dp" android:bottom="10dp" />nnnnnnnn </shape>nnnn </item>nnnnnn <item>nnnnnnnn <shape>nnnnnnnnnnnn <gradient android:startColor="#000000" android:endColor="#ffffff" nnnnnnnnnnnnnnnn android:angle="180" />nnnnnnnnnnnn <stroke android:width="1dip" android:color="#f403c9" />nnnnnnnnnnnn <corners android:radius="5dip" />nnnnnnnnnnnn <padding android:left="10dp" android:top="10dp"nnnnnnnnnnnnnnnn android:right="10dp" android:bottom="10dp" />nnnnnnnn </shape>nnnn </item>n</selector>nngradient 主体渐变startColor开始颜色,endColor结束颜色 ,angle开始渐变的角度(值只能为90的倍数,0时为左到右渐变,90时为下到上渐变,依次逆时针类推)stroke 边框 width 边框宽度,color 边框颜色corners 圆角 radius 半径,0为直角padding text值的相对位置。
通过控制Button移动来学习Android坐标
小Demo大知识-通过控制Button移动来学习Android坐标今天分享一个简单的Demo。
Demo实现的功能就是,用鼠标点中button的时候,然后拖动Button。
这时候Button会根据你鼠标的移动而移动,同时,你鼠标点中的Button的位置也不会改变。
比如你点在Button的左上角,那移动的时候。
作者:青蛙要fly来源:安卓巴士Android开发者门户|2017-01-11 17:38收藏分享今天分享一个简单的Demo。
Demo实现的功能就是,用鼠标点中button的时候,然后拖动Button。
这时候Button会根据你鼠标的移动而移动,同时,你鼠标点中的Button的位置也不会改变。
比如你点在Button的左上角,那移动的时候。
鼠标还是在Button的左上角一言不合上效果图大家不要介意上面那么模糊的gif图,毕竟我是用手机拍的。
(介意你又能拿我怎么办。
哈哈)我们先来打个预防针,先学习基本的知识点:涉及到的方法一共有下面几个:∙view获取自身坐标:getLeft(),getTop(),getRight(),getBottom() ∙view获取自身宽高:getHeight(),getWidth()∙motionEvent获取坐标:getX(),getY(),getRawX(),getRawY() 1.view获取自身坐标如上图所以,绿色区域的父视图是黄色区域,所以left是55,top是55。
黄色区域的父视图是蓝色区域,所以left是60,top是115。
2.view获取自身宽高没错。
从字面意思看就能理解,就是获取View的宽高。
这里提到一个以前遇到的一个问题,就是在Activity中有时候获取某个View的width和height会为0。
3.motionEvent获取坐标∙getX():获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离∙getY():获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离∙getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离getRawY():获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离所以当我们用鼠标点击Button中间时候,那这时候getX()就是我们鼠标点击的位置与Button左边边界的距离。
Android实现系统级悬浮按钮
Android实现系统级悬浮按钮本⽂实例为⼤家分享了Android系统级悬浮按钮的具体代码,供⼤家参考,具体内容如下具体的需求1、就是做⼀个系统级的悬浮按钮,就像iPhone 桌⾯的那个悬浮按钮效果⼀样,能随意拖动,并且⼿⼀放开,悬浮按钮就⾃动靠边。
2、可以点击并且可以随意拖动。
3、悬浮按钮⾃动靠边的时候,或者移动到边上的时候,⾃动隐藏半边。
4、横竖屏切换都兼容1、就在WindowManager ⾥⾯添加View,这个View通过⾃定义控件来实现。
2、在onTouch⾥的MotionEvent.ACTION_MOVE事件⾥头,通过控制悬浮按钮的具体坐标来实现随意移动。
3、在onTouch⾥的MotionEvent.ACTION_UP事件⾥头,来控制悬浮按钮⾃动靠边,并且⾃动隐藏半边,不过在这⾥onTouch和onClick这两个事件是⼀起触发的,不过这也有解决办法,你可以在⼿放开的瞬间,通过移动的距离,来决定是否触发点击事件,,如果返回false,就会触发点击事件,如果返回true就会触发点击事件4、通过⾃定义控件onLayout⽅法,来捕获横竖屏切换事件,5、还有⼀个靠哪边停靠的问题,通过坐标来判读更靠近哪⼀边。
就靠哪边停靠。
![以中间这个中⼼点为准,以更短的X轴画⼀个正⽅形]下⾯是具体实现代码:import android.content.Context;import android.graphics.Canvas;import android.graphics.Point;import android.graphics.Rect;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.ImageView;import com.iapppay.openid.channel.LoginResultCallback;import com.iapppay.openid.channel.OpenIDApplication;import com.iapppay.openid.channel.util.DisplayUtil;import com.iapppay.openid.channel.util.LogUtil;import com.iapppay.openid.channel.util.Res;/*** Created by HuangTiebing 2017/2/14.*/public class DragFloatActionButton extends ImageView implements View.OnTouchListener, View.OnClickListener {public static String TAG = "DragFloatActionButton";private Context context;float lastX, lastY;float originX, originY;int screenWidth;int screenHeight;private int originWidth;private WindowManager windowManager;// // 此windowManagerParams变量为获取的全局变量,⽤以保存悬浮窗⼝的属性private youtParams windowManagerParams;private LoginResultCallback resultCallback; //悬浮按钮点击回调public DragFloatActionButton(Context context, boolean isForceLogin, LoginResultCallback resultCallback) {this(context, null);OpenIDApplication.getInstance().setForceLogin(isForceLogin);this.resultCallback = resultCallback;}public DragFloatActionButton(Context context, AttributeSet attrs) {this(context, attrs, 0);}public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.context = context;Point screenSize = DisplayUtil.getScreenSize(context);screenWidth = screenSize.x;screenHeight = screenSize.y;setImageResource(Res.drawable(context, "ipay_float_btn_bg"));setOnTouchListener(this);setOnClickListener(this);windowManager = (WindowManager) getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE); }public int getOriginWidth() {return originWidth;}public void setOriginWidth(int originWidth) {this.originWidth = originWidth;}@Overridepublic boolean onTouch(View v, MotionEvent event) {windowManagerParams = (youtParams) this.getLayoutParams();//获取到状态栏的⾼度Rect frame = new Rect();getWindowVisibleDisplayFrame(frame);int ea = event.getAction();switch (ea) {case MotionEvent.ACTION_DOWN:lastX = event.getRawX();// 获取触摸事件触摸位置的原始X坐标lastY = event.getRawY();originX = lastX;originY = lastY;break;case MotionEvent.ACTION_MOVE:float dx = event.getRawX() - lastX;float dy = event.getRawY() - lastY;windowManagerParams.x += dx;windowManagerParams.y += dy;LogUtil.d(TAG, "移动距离:dx=" + dx + ",dy=" + dy);showAllBtn();lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:float lastMoveDx = Math.abs(event.getRawX() - originX);float lastMoveDy = Math.abs(event.getRawY() - originY);LogUtil.d(TAG, "松开时,移动距离:lastMoveDx=" + lastMoveDx + ", lastMoveDy=" + lastMoveDy);if (lastMoveDx < 10 && lastMoveDy < 10) { //移动距离太⼩,视为点击,return false;} else {updateViewLayout(event);isFirstClick = true;return true;}}return false;}/*** 显⽰整个图标*/public void showAllBtn() {windowManagerParams.width = originWidth;windowManagerParams.height = originWidth;setImageResource(Res.drawable(context, "ipay_float_btn_bg"));windowManager.updateViewLayout(this, windowManagerParams); // 刷新显⽰}/*** 悬浮按钮显⽰在左边*/private void showInLeft() {windowManagerParams.x = 0;windowManagerParams.width = originWidth / 2;windowManagerParams.height = originWidth;setImageResource(Res.drawable(context, "ipay_float_btn_left_hidden"));windowManager.updateViewLayout(this, windowManagerParams); // 刷新显⽰ }/*** 悬浮按钮显⽰在右边*/private void showInRight() {windowManagerParams.width = originWidth / 2;windowManagerParams.height = originWidth;windowManagerParams.x = screenWidth - windowManagerParams.width;setImageResource(Res.drawable(context, "ipay_float_btn_right_hidden"));windowManager.updateViewLayout(this, windowManagerParams); // 刷新显⽰ }/*** 悬浮按钮显⽰在上⾯*/private void showInTop() {windowManagerParams.y = 0;windowManagerParams.width = originWidth;windowManagerParams.height = originWidth / 2;setImageResource(Res.drawable(context, "ipay_float_btn_top_hidden"));windowManager.updateViewLayout(this, windowManagerParams); // 刷新显⽰ }/*** 悬浮按钮显⽰在下⾯*/private void showInBottom() {windowManagerParams.width = originWidth;windowManagerParams.height = originWidth / 2;windowManagerParams.y = screenHeight - windowManagerParams.width;setImageResource(Res.drawable(context, "ipay_float_btn_bottom_hidden")); windowManager.updateViewLayout(this, windowManagerParams); // 刷新显⽰ }/*** 更新悬浮图标** @param event ⼿动移动事件*/public void updateViewLayout(MotionEvent event) {Point center = new Point(screenWidth / 2, screenHeight / 2); //屏幕中⼼点float xOffset, yOffset;//以屏幕中⼼点为原点,X轴和Y轴上的偏移量if (event != null) {//⼿动移动的xOffset = event.getRawX() - center.x;yOffset = event.getRawY() - center.y;} else {//⾃动隐藏xOffset = lastX - center.x;yOffset = lastY - center.y;}if (Math.abs(xOffset) >= Math.abs(yOffset)) {//向左或向右缩进隐藏if (xOffset <= 0) { //向左缩进showInLeft();} else {showInRight();}} else {//向上或向下缩进隐藏if (yOffset <= 0) {//向上缩进showInTop();} else {showInBottom();}}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);Point screenSize = DisplayUtil.getScreenSize(context);if (screenWidth != screenSize.x) {//屏幕旋转切换screenWidth = screenSize.x;screenHeight = screenSize.y;lastY = windowManagerParams.x;lastX = windowManagerParams.y;windowManagerParams.x = (int) lastX;windowManagerParams.y = (int) lastY;updateViewLayout(null);}}private boolean isFirstClick = true;@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}@Overridepublic void onClick(View v) {LogUtil.d(TAG, "执⾏点击事件");if (!isFirstClick) {OpenIDApplication.getInstance().floatBtnClick(context, OpenIDApplication.getInstance().isForceLogin(), resultCallback);} else {//半隐藏状态,点击显⽰全部isFirstClick = false;showAllBtn();}}}调⽤实现代码,这⾥注意有个问题,弹出系统级的悬浮窗,需要配置权限:并且Android 6.0以上的⼿机,还要弹出对话框问⽤户是否运⾏,如果这个⽤户拒绝了,就不能弹出系统级的悬浮窗了,还有个别⼿机⼚商修改了android源码,还需要进系统设置⾥去允许这个应⽤弹出悬浮窗。
Android学习笔记五:基本视图组件:Button
Android学习笔记五:基本视图组件:ButtonButton组件也是我们前面看到过的一个简单组件,这里我们来进行深入的介绍。
按钮的基本功能就是供用户点击,然后产生一些效果,比如Web开发中的登录按钮,点击之后即可实现登录效果。
这里我们没有对Button的事件处理操作,还是简单的了解Button的配置。
首先来看一下Button的文档:ng.Object↳ android.view.View↳ android.widget.TextView↳ android.widget.Button可以看到Button类是TextView类的子类,而不是直接继承自View类的。
可以说Button 是一个特殊的TextView,下面在Eclipse中新建一个项目来演示Button组件:Xml代码可以看出,Button组件的配置和TextView是极其类似的,因为从类的继承结构上就不难得出这个结论。
这里我们也是设置了按钮组件显示的文本,文本的颜色以及文本的大小,下面运行程序来看一下具体效果:再来看第二个Button示例:Xml代码这个Button组件中,我们设置layout_width为wrap_content,也就是包裹文字大小,而不是充满屏幕。
同时设置了layout_gravity属性为center,也就是居中显示,而layout_marginTop的意思就是距离上个组件的上边距为20dp,这和CSS中的概念也是一致的。
重新设置Button的显示文本和文字大小,再次运行程序,这次在横屏下显示,来看一下效果:可以看到最终的效果就是上边距为20dp,而左右边距没有变化,仅仅是包裹文字的宽度来显示的。
下面再来看一个示例:Xml代码这里我们调整了layout_width为fill_parent,而设置layout_margin为15dp,也就是上下左右边距都为15dp,再设置最大的显示长度为14个字符,之后运行程序,我们可以看到如下的显示效果:要注意的是这里如果设置layout_width为wrap_content,那么就不会得到左右边距15dp 的效果,而仅仅是包裹文字了。
[Android教程_兄弟连马剑威]_013_Button和ImageButton
• android:tint • 将图片渲染成指定的颜色。
2、ImageView
3、ImageButton
• 显示一个按钮和一个图像(而不是文字),可以按下或由用户点击。默认情况下,一个ImageButton看上去就像一个 普通的按钮,与标准按钮背景颜色变化在不同按钮的状态。表面的按钮上的图像通过android:定义XML元素的src 属性或setImageResource(int)方法。
• fitEnd
按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的右边
• center
按原图大小显示图片,但图片宽高大于View的宽高时,截图图片中间部分显示
• centerCrop
按比例放大原图直至等于某边View的宽高显示。
• centerInside
当原图宽高或等于View的宽高时,按原图大小居中显示;反之将原图缩放至View的宽高 居中显示。
二、配置透明的Button style="?android:attr/borderlessButtonStyle“
三、配置Button style 通过配置 Android:background 来设置按钮样式。
2、ImageView
• public class ImageView extends View • 显示一个任意的图像,如一个图标。ImageView类可以加载图像从不同来源(如资源或内容提供者),负责计算图像
的测量,这样它就可以用于任何布局管理器,并提供各种显示选项,如缩放和着色。
• XML属性 • android:src • 设置View的drawable(如图片,也可以是颜色,但是需要指定View的大小) • android:adjustViewBounds • 是否保持宽高比。需要与maxWidth、MaxHeight一起使用,否则单独使用没有效果。 • android:maxHeight • 设置View的最大高度,单独使用无效, • 需要与setAdjustViewBounds一起使用。 • 如果想设置图片固定大小,又想保持图片宽高比, • 需要如下设置: • 1) 设置setAdjustViewBounds为true; • 2) 设置maxWidth、MaxHeight; • 3) 设置设置layout_width和layout_height为wrap_content • android:maxWidth • 设置View的最大宽度。同上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
布局文件1:
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
当用以上布局文件产生两个button的时候,系统会在两个button之间留一个缝
隙,效果如下所示:
如何去掉上面2个button之间的缝隙?改写上面的布局文件如下所示
即可:
布局文件2:
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add_string"
android:layout_weight="1"
android:layout_marginRight="-7px" //数值可微调
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/cancle_string"
android:layout_weight="1"
android:layout_marginLeft ="-7px"//数值可微调
/>
去掉缝隙后的效果如下所示:
作者:上海华勤 malik