实现透明窗口事件(配合RelativeLayout使用)
先来看效果
一.透明窗口实现
1.简介
透明窗口使用透明主题,这种最终实现的肯定是透明啦,比如桌面的搜索应用时有的手机会有你搜索时背景显示一些你常用的软件,像蒙了一层纱一样,这层纱就是透明主题。
long long ago,我以为透明主题是有专门的控件来实现,真实的情况是他就是一个活动,只是要使用自定义背景罢了。使用透明主题时,一个活动切换到透明主题,不会有onStop()回调,如果是非透明主题会有onStop()回调。
一般会有两种实现,一种是Dialog,但是样式功能少一些,另一种就是Activity仿造Dialog实现。本文讲第二种。
2.使用
(1)在res/values目录下自定义一个透明的主题,可以文件名为style.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyDialogStyle" parent="Theme.AppCompat.Dialog">
<item name="android:windowBackground">@android:color/transparent</item> 窗口背景颜色
<item name="android:windowIsFloating">true</item> 定义窗口可悬浮
<item name="android:windowIsTranslucent">true</item> 窗口透明
<item name="android:windowNoTitle">false</item> 窗口没有标题
<item name="android:windowCloseOnTouchOutside">false</item>点击外面空白区域是否关闭窗口
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>动画样式
<item name="android:backgroundDimEnabled">true</item>弹出对话框效果,true对话框后是亮的,false对话框后面是暗的
</style>
</resources>
parent="Theme.AppCompat.Dialog"这句一定不能少,我之前程序崩都是这句的问题,我理解是这个样式继承这个父类样式,如果不继承不算一个Dialog。
在values/colors内容里定义translucent_background,这样就透明了。
<color name="translucent_background">#00000000</color>
安卓颜色设置三种方式
在color/xml文件中
I.按照数值手动指定颜色 #00000000,这样#是固定符号,数值部分每一位变化范围是0到f,前两位是透明度,数值越大越不透明,后六位是颜色,数值越大颜色越浅,例如#ffffffff就是白色。
II.系统自带颜色 @android:color/transparent
但颜色不全,只有一些常用的,使用方法就是@android:color/,后面系统会显示一些颜色关键字,就可以根据需要补全了,或者不知道关键字代表什么颜色的时候,可以随便补全一个,然后查看系统源码,选取颜色。
III.史上最全颜色指定方式
-
Delete Link
在我们已经定义好的color前面会出现一个色框,点击这个色框,弹出如下界面,然后就可以在图里选色,或者右上角指定。
(2)接下来新建一个类,在类里对这个自定义的主题进行引用
有三种方式
I.类内部使用 setTheme(R.style.MyDialogStyle);
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class lv1 extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lv1);
setTheme(R.style.MyDialogStyle);
}
}
R.layout.lv1这个布局我将在第二部分说。要注意的是代码第三行的 android:theme="@android:style/MyDialogStyle"与 setTheme(R.style.MyDialogStyle);有异曲同工之妙,
II.在AndroidManifest使用:
<activity android:name=".lv2"
android:theme="@style/MyDialogStyle"/>
新建的类不要忘记在注册文件里声明一下:,我之前建活动总是直接新建一个类让他继承extends AppCompatActivity ,这样就需要手动注册文件,很容易忘记,所以以后在建活动时候,还是用AS自带的建类方式比较好,File->New->Activity->Empty Activity(如果活动没有什么特殊要求,还可以根据情况选择对应的活动)
III.在布局文件里使用
直接在布局中 写 android:theme="@style/MyDialogStyle"
主题一般是在对应的类或者注册文件里引用。在类对应的布局文件中也可以引用主题,不会报错,但是跟前两种相比完全不同。原因是布局文件里指定的是布局效果,而前两种指定的是windows的效果,布局文件只是windows里的一层。
(3)在主活动里根据情况使用它,我这里是点击按钮来跳转,你也可以根据效果来设置它的触发事件。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button0=(Button)findViewById(R.id.button0);
button0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,lv1.class);
startActivity(intent);
}
});
}}
在lv1活动中,我是这样写的:
public class lv1 extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lv1);
setTheme(R.style.MyDialogStyle);
ImageView back_button=(ImageView)findViewById(R.id.back_button) ;
back_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}}
这里就是用一个 ImageView充当按钮, 要注意的是 finish(); 通常四大组件的生命周期不是用来直接调用的,我之前这里用的是onDestroy(),页面关闭有延迟,还会有黑屏过渡,并且在关闭后按back键会一层层把之前的页面显示出来,因为我的调用会对原本生命周期造成影响。所以一般用finish(),这种用法即便finish()后面还有代码,也会执行完毕,不会直接停止。就不会出现上述的情况。
###二.RelativeLayout使用
上面代码布局你可以在lv1布局文件里随便布局,实现透明窗口效果。如果需要我的布局,我给你页面结构参考,代码太长了,贴出来太长,而且重复工作很多。
RelativeLayout翻译过来就是相对布局,相对父布局或者相对
这个是我的大致结构,我是用绝对布局与线性布局嵌套的方式来实现的,其实布局嵌套层次过多有时会引起过度绘制,比如你每个布局都设置一下自己的背景,也就是android:background属性,当然我肯定不会这么做的,所以不会有这个问题。
![1541814874824.png](https://i.loli.net/2018/11/10/5be63a70ccf41.png)
我以其中一个为例来解析一下这个布局,当然你直接贴我代码肯定运行不起来,只能参考,因为我的布局是要有一些我本地图片资源引用进来的。不过经过我的解析,你就能有恍然大明白的感觉了。这里要注意的是——导入到res/drawable目录下的图片是App要用的图片,而到bitmap里面的一般是APP的图标,有不同的大小等级可以导入。res/drawable图片名称要是数字字母下划线组成的,有特殊字符就识别不出来,而且整个索引都建立不起来,UI给的图片都有@要一个个去掉,还有就是导入直接拖动过来我的电脑好像不行,要直接导入到工程的对应文件夹目录下。
<TextView
android:layout_centerHorizontal="true"
android:id="@+id/lv1"
android:layout_width="30dp"
android:layout_height="30dp"
android:gravity="center"文字位于正中心
android:text="@string/lv6"
android:textColor="@color/black"
android:textSize="12dp"
/>
android:layout_marginXXX,遇到这个就是相对父布局的位置,什么top,buttom,left,right就往里填吧android:layout_toLeftOf是相对于兄弟控件某个控件的位置,同理left可以替换成别的
android:paddingLeft就是组件内部的相对位置的,如果指定一个布局的paddingLeft和paddingRightt会在两边留白
参见: http://www.runoob.com/w3cnote/android-tutorial-relativelayout.html
布局时候手动布局居多,很少有直接的wrap_content,一般手动布局常用的就是RelativeLayout,通常首先把中心点限定好,用 android:layout_centerHorizontal="true"可以把一个控件限定到布局正中心,然后在同一控件内根据它布局的·控件里加上
android:layout_toLeftOf="@id/lv1"
android:layout_marginRight="40dp"
可以限定它在中心控件lv1的左边,而且两个控件之间的距离就是40dp,当然也可以把限定距离android:layout_marginRight="40dp"这句放在中心控件里,那就要改成android:layout_marginLeft="40dp"了
再来看一下那个叉号的布局,它实现按钮效果,主要是android:contextClickable="true"这句,就行了。
<ImageView
android:contextClickable="true"
android:id="@+id/back_button"
android:background="@drawable/ic_bullet_box_closed3x"
android:layout_above="@+id/main_panel"在某个控件上面
android:layout_marginBottom="10dp"
android:layout_width="30dp"
android:layout_gravity="right"布局右面
android:layout_height="30dp"/>
布局这个东西多写就好了,系统地学会系统地忘记,哈哈。
接下来就是布局时候的一些其他的点
(1).圆角按钮
正常的按钮式方形的,棱角很分明,所以很丑。
圆角按钮实现首先在drawable目录下新建一个xml文件,这里我给他起名为shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 填充的颜色 -->
<solid android:color="@color/orange" />
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径,数字大一些更圆润一些-->
<corners android:radius="15dip" />
<!-- padding:Button里面的文字与Button边界的间隔 -->
<padding
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp" />
</shape>
对应按钮的布局文件就是
<Button
android:id="@+id/special_right_button"
android:background="@drawable/shape"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="22dp"
android:textColor="@color/black"
android:text="@string/special_right"
/>
android:background="@drawable/shape",这个,对他进行引用。