实现自定义dialog样式

实现自定义dialog样式_第1张图片

1定义弹出的dialog样式


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <Button

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/mbtn"
        android:text="拨号"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="10sp"
        android:background="#8E8989"/>
    <Button

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/mbtn"
        android:text="10086"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="10sp"
        android:background="#8E8989"/>
    <Button

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/mbtn"
        android:text="取消"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="10sp"
        android:background="#8E8989"/>

LinearLayout>

实现自定义dialog样式_第2张图片

2自定义dialog类,继承自Dialog,并加载自定义dialog的布局

package com.njupt.animination

import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.Gravity
import android.view.ViewGroup

class MyDiaglog:Dialog {
    constructor(context: Context?):this(context,0){}

    constructor(context: Context?,themId:Int):super(context!!,themId){
        //在此方法里面加载布局
        setContentView(R.layout.my_dialog)
        //设置在下面弹出
        window?.setGravity(Gravity.BOTTOM)
        //设置弹出的大小
        window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT)
    }

}

3在anim资源文件中定义出dialog的进出动画

入场位置dialog_enter.xml



<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="400"
    android:fromYDelta="100%p"
    android:toYDelta="0">
    
translate>

出场位置dialog_exit.xml


<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="400"
    android:fromYDelta="0"
    android:toYDelta="100%p">

translate>

4在style文件中指定这两种进出动画,并且将窗口的背景设为透明#00000000


<resources>

    
    <style name="dialog" parent="@android:style/Theme.Dialog">
        
        "windowNoTitle">true
        "android:windowAnimationStyle">@style/dialog_anim
        "android:windowBackground">@drawable/transparent
    style>
    
    <style name="dialog_anim" parent="@android:style/Animation.Dialog">
        "android:windowEnterAnimation">@anim/dialog_enter
        "android:windowExitAnimation">@anim/dialog_exit
    style>
    <style name="mbtn">
        "android:textColor">@color/white
        "android:textSize">16sp
    style>
resources>

其中透明颜色在color.xml布局中

<resources>
    <drawable name="transparent">#00000000drawable>
resources>

5在主程序中调用显示dialog

package com.njupt.animination

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class MainActivity : AppCompatActivity() {
    private val mdialog:MyDiaglog by lazy {
        MyDiaglog(this,R.style.dialog)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btn=findViewById<Button>(R.id.btn1)
        btn.setOnClickListener(){
            mdialog.show()
        }
    }
}

你可能感兴趣的:(android)