精华内容
下载资源
问答
  • Android dialogplus-master安卓弹窗实例应用,里面包含多种弹窗效果,是个很好的借鉴demo。
  • 5.定义弹窗的Activity SelectPicPopupWindow.java import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View....

    实际开发中会经常碰到这样的需求,从底部弹出一个类似对话框的UI,很多分享的界面就是类似这种UI。

    实现原理大概有2种方式:第一种就是使用Activity实现,第二种就是利用PopWindow,这边文章说下使用Activity的实现方法。


    Activity的实现原理:

    1.弹框的Activity中定义一个布局(高度要采用包裹内容的方式,否则占满全屏不会有透明效果)

    alert_dialog.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical" >
    
        <LinearLayout
            android:id="@+id/pop_layout"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@drawable/btn_style_alert_dialog_background"
            android:gravity="center_horizontal"
            android:orientation="vertical" >
    
            <Button
                android:id="@+id/btn_take_photo"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dip"
                android:layout_marginRight="20dip"
                android:layout_marginTop="20dip"
                android:background="@drawable/btn_style_alert_dialog_button"
                android:text="拍照"
                android:textStyle="bold" />
    
            <Button
                android:id="@+id/btn_pick_photo"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dip"
                android:layout_marginRight="20dip"
                android:layout_marginTop="5dip"
                android:background="@drawable/btn_style_alert_dialog_button"
                android:text="从相册选择"
                android:textStyle="bold" />
    
            <Button
                android:id="@+id/btn_cancel"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="15dip"
                android:layout_marginLeft="20dip"
                android:layout_marginRight="20dip"
                android:layout_marginTop="15dip"
                android:background="@drawable/btn_style_alert_dialog_cancel"
                android:text="取消"
                android:textColor="#ffffff"
                android:textStyle="bold" />
        </LinearLayout>
    
    </RelativeLayout>


    2.定义弹框Activity的样式(包括进入、退出时的动画)

    styles.xml

    <resources>
        <style name="AppTheme" parent="android:Theme.Light" />
        <!-- 定义弹框Activity的进入、关闭动画 -->
        <style name="AnimBottom" parent="@android:style/Animation">
            <item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
            <item name="android:windowExitAnimation">@anim/push_bottom_out</item>
        </style>
        
        <style name="MyDialogStyleBottom" parent="android:Theme.Dialog">
            <item name="android:windowAnimationStyle">@style/AnimBottom</item>
            <item name="android:windowFrame">@null</item>
            <!-- 边框 -->
            <item name="android:windowIsFloating">false</item>
            <!-- 是否浮现在activity之上 -->
            <item name="android:windowIsTranslucent">true</item>
            <!-- 半透明 -->
            <item name="android:windowNoTitle">true</item>
            <!-- 无标题 -->
            <item name="android:windowBackground">@android:color/transparent</item>
            <!-- 背景透明 -->
            <item name="android:backgroundDimEnabled">true</item>
            <!-- 模糊 -->
        </style>
    </resources>

    在value下colors.xml中定义透明颜色值transparent 

    <color name="transparent">#00000000</color>


    3.在anim下定义Activity的进入和退出的动画

    push_bottom_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 上下滑入式 -->
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
        <translate
            android:duration="200"
            android:fromYDelta="100%p"
            android:toYDelta="0"        
         />      
    </set>


    push_bottom_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 上下滑出式 -->
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
        <translate
            android:duration="200"
            android:fromYDelta="0"
            android:toYDelta="50%p" />
    </set>



    4.在清单文件中配置

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.picpopupwindow"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/title_activity_main" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <!-- 定义弹框的Activity,并指定其动画 -->
            <activity android:name=".SelectPicPopupWindow" android:theme="@style/MyDialogStyleBottom" /> 
        </application>
    
    </manifest>



    5.定义弹窗的Activity

    SelectPicPopupWindow.java

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.Toast;
    public class SelectPicPopupWindow extends Activity implements OnClickListener{
    
    	private Button btn_take_photo, btn_pick_photo, btn_cancel;
    	private LinearLayout layout;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.alert_dialog);
    		btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);
    		btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);
    		btn_cancel = (Button) this.findViewById(R.id.btn_cancel);
    		
    		layout=(LinearLayout)findViewById(R.id.pop_layout);
    		
    		//添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity
    		layout.setOnClickListener(new OnClickListener() {
    			
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!", 
    						Toast.LENGTH_SHORT).show();	
    			}
    		});
    		//添加按钮监听
    		btn_cancel.setOnClickListener(this);
    		btn_pick_photo.setOnClickListener(this);
    		btn_take_photo.setOnClickListener(this);
    	}
    	
    	//实现onTouchEvent触屏函数但点击屏幕时销毁本Activity
    	@Override
    	public boolean onTouchEvent(MotionEvent event){
    		finish();//如果不想点击外部关闭弹窗去掉此行代码即可
    		return true;
    	}
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.btn_take_photo:
    			break;
    		case R.id.btn_pick_photo:				
    			break;
    		case R.id.btn_cancel:				
    			break;
    		default:
    			break;
    		}
    		finish();
    	}
    }
    需要调用时只需要开启SelectPicPopupWindow即可。

    效果图:


    完整Demo下载:http://download.csdn.net/detail/linder_qzy/9454611


    展开全文
  • 安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,并在应用的任何地方添加任意代码,增加任意任何您想实现的功能。本教程通过对最近流行的“最美手...
  • 安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,并在应用的任何地方添加任意代码,增加任意任何您想实现的功能。通过这种方式,把该应用变为您...

     安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,并在应用的任何地方添加任意代码,增加任意任何您想实现的功能。通过这种方式,把该应用变为您自己的应用(通过安卓修改大师反编译生成的新应用仅供个人学习反编译知识,严禁用于商业用途)。

    安卓修改大师提供海量的应用、游戏和电子书作为修改模板,您只需要在安卓修改大师中找到想要修改的应用,点击该应用的安装或者一键安装按钮,即可自动打开相关的反编译选项。

    本教程通过对最近流行的最美手电筒应用进行反编译并重新打包,实现在用户按下关闭手电筒按钮的时候,弹出一个提示弹窗,提示用户“哈哈~你必须付钱才能关掉我,您确定现在就要付钱吗?”,如果用户选择确定,将打开设置的网页,如果用户选择取消,将关闭应用。

    好了,闲话少说,我来开始演示如何进行反编译和添加自定义代码吧~~

    第一步,在安卓修改大师顶部的搜索框输入“手电筒”并开始搜索(见下图),搜索列表中出现很多匹配到“手电筒”关键字的应用,点击“最美手电筒”后面的一键安装按钮, 系统会自动弹出相关的反编译选项菜单,可以通过本菜单将应用安装到手机,或者查看源代码,也可以直接进行反编译。点击菜单中的“反编译”按钮,进入到该应用的反编译界面。

     

    由于我们要实现的是点击关闭按钮后弹出一个提示窗口,因此我们需要先找到这个关闭按钮的图片资源,以便通过资源名称找到相应的界面和调用方法(如果是文字按钮,就更简单了,直接在安卓修改大师的搜索功能里面直接搜索按钮文字即可)。最美手电筒的原始界面如下。

    我们在安卓修改大师的左侧点击高级模式,然后一层层展开目录列表,在drawable相关的目录里面浏览图片,找到和应用运行界面图对应的图片资源,如下图所示,分别是关闭状态和打开状态的图片。我们是要针对关闭按钮进行操作,所以关注一下关闭按钮的图片资源名称是 off 

    通过搜索功能或者直接在高级模式中浏览layout目录,打开相应的界面布局,我们仔细观察就可以找到Home.xml是这个最美手电筒的主界面,这个xml里面包含了上述的关闭按钮的图片资源名称。

    双击打开Home.xml,我们可以清晰的看到这个按钮的图片资源名称和点击后调用的方法名称“switchTorch”,见下图。这个调用方法名称很重要,我们通过这个名称作为入口查询该方法所在的代码页面。

     

    点击安卓修改大师的左侧搜索/替换功能,打开的界面中输入“switchTorch”进行搜索,将搜索到包含该关键字的所有的代码,通过双击打开每个代码页面分析,很快就能找到该方法所在的页面,如下图选中的一行。

    双击打开该代码页面,可以看到,已经自动定位到了该调用方法,后续将通过在该方法里面添加代码,来实现弹出提示窗口的功能。

    将该代码页面拉到顶部,第一行定义了该类名的包含包名的全路径,下图红框内的路径极为重要,后面很多地方会用到,需要记录下来。

    .class public Lcom/nanshan/simpletorch/home/HomeActivity;”

    其中,红颜色部分是包路径,蓝色部分是调用的本类的类名。

    下面,就开始最核心的代码移植的工作了。点击高级模式,目录浏览中,按照上面获得的包名,依次从smali展开,逐级点击打开目录,一直到能看到上面获得那个类名的文件。然后点击右下角的打开所在目录,将打开包名对应的磁盘目录。

    现在来讲解一下要实现的功能对应的代码。安卓应用的反编译代码移植采用的是smali语言,并非Java语言,需要您有一定的Smali的基础知识。当然,如果您现在还完全不懂smali语言,也没有关系,按照下面的教程拷贝粘贴就可以了。

    由于要实现的是提示弹窗功能,该功能有两个按钮,每个按钮对应独立的功能。在Smali里面,一般一个独立的功能类对应一个独立的文件。本功能对应的代码片段有三个,一个在关闭按钮点下的时候调用的代码,另外两个分别对应的是确定和取消的代码。

    上述功能对应的java代码为:

                    AlertDialog dialog = new AlertDialog.Builder(this)

                                     .setTitle("提示")// 设置对话框的标题

                                     .setMessage("哈哈~你必须付钱才能关掉我,您确定现在就要付钱吗?")//  设置对话框的内容

                                     //  设置对话框的按钮

                                     .setNegativeButton("取消",  new DialogInterface.OnClickListener() {

                                             @Override

                                             public  void onClick(DialogInterface  dialog, int which) {

                                                     dialog.dismiss();

                                             }

                                     }).setPositiveButton("确定",  new DialogInterface.OnClickListener() {

                                             @Override

                                             public  void onClick(DialogInterface  dialog, int which) {

                                                     Uri  uri = Uri.parse("http://www.apkeditor.cn/pay/default.aspx");

                                                     Intent  intent = new Intent(Intent.ACTION_VIEW,  uri);

                                                     startActivity(intent);

                                                     dialog.dismiss();

                                             }

                                     }).create();

                    dialog.show();

    由于安卓反编译后修改逻辑必须在Smali文件里面修改,因此需要将上述代码转换成Smali代码。下面已经转换为Smali代码,只需要复制粘贴即可。后续会出详细教程讲解如何将Java代码生成Smali代码。

    下面是取消按钮对应的代码,请在上述包名对应的目录里面创建一个文本文件,命名为 ApkEditorLoader$1.smali “,将下面的代码拷贝到里面,并将代码中所有的 Lcom/txeasy/shoudiantong/ “替换为之前获得的包路径,将代码中所有的 MainActivity “替换为之前获得的类名。后面两份代码也相同操作。

    .class Lcom/txeasy/shoudiantong/ApkEditorLoader$1;

    .super Ljava/lang/Object;

    .source  "MainActivity.java"

    #  interfaces

    .implements  Landroid/content/DialogInterface$OnClickListener;

    #  annotations

    .annotation  system Ldalvik/annotation/EnclosingMethod;

        value = Lcom/txeasy/shoudiantong/MainActivity;->onCreate(Landroid/os/Bundle;)V

    .end  annotation

    .annotation  system Ldalvik/annotation/InnerClass;

        accessFlags  = 0x0

        name = null

    .end  annotation

    #  instance fields

    .field  final synthetic this$0:Lcom/txeasy/shoudiantong/MainActivity;

    # direct  methods

    .method  constructor <init>(Lcom/txeasy/shoudiantong/MainActivity;)V

        .locals 0

        .prologue

        iput-object  p1, p0, Lcom/txeasy/shoudiantong/ApkEditorLoader$1;->this$0:Lcom/txeasy/shoudiantong/MainActivity;

        invoke-direct {p0}, Ljava/lang/Object;-><init>()V

        return-void

    .end  method

    # virtual  methods

    .method  public onClick(Landroid/content/DialogInterface;I)V

        .locals 0

        .param  p1, "dialog"     # Landroid/content/DialogInterface;

        .param  p2, "which"     # I

        .prologue

        invoke-interface {p1}, Landroid/content/DialogInterface;->dismiss()V

        return-void

    .end  method

     

    确定按钮对应的代码,请在上述包名对应的目录里面创建一个文本文件,命名为 ApkEditorLoader$2.smali “代码中的包名和类名按照前述方法进行替换。

    .class Lcom/txeasy/shoudiantong/ApkEditorLoader$2;

    .super Ljava/lang/Object;

    .source  "MainActivity.java"

    # interfaces

    .implements Landroid/content/DialogInterface$OnClickListener;

    # annotations

    .annotation system Ldalvik/annotation/EnclosingMethod;

        value =  Lcom/txeasy/shoudiantong/MainActivity;->onCreate(Landroid/os/Bundle;)V

    .end annotation

    .annotation system Ldalvik/annotation/InnerClass;

        accessFlags  = 0x0

        name = null

    .end annotation

    # instance fields

    .field final synthetic this$0:Lcom/txeasy/shoudiantong/MainActivity;

    # direct methods

    .method constructor <init>(Lcom/txeasy/shoudiantong/MainActivity;)V

        .locals 0

        .prologue

        iput-object  p1, p0, Lcom/txeasy/shoudiantong/ApkEditorLoader$2;->this$0:Lcom/txeasy/shoudiantong/MainActivity;

        invoke-direct {p0}, Ljava/lang/Object;-><init>()V

        return-void

    .end method

    # virtual methods

    .method public onClick(Landroid/content/DialogInterface;I)V

        .locals 3

        .param  p1, "dialog"     # Landroid/content/DialogInterface;

        .param  p2, "which"     # I

        .prologue

        const-string  v2, "http://www.apkeditor.cn/pay/default.aspx?username=xiaoping"

        invoke-static {v2}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

        move-result-object v1

        .local v1, "uri":Landroid/net/Uri;

        new-instance v0, Landroid/content/Intent;

        const-string  v2, "android.intent.action.VIEW"

        invoke-direct {v0, v2,  v1},  Landroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;)V

        .local v0,  "intent":Landroid/content/Intent;

        iget-object  v2, p0, Lcom/txeasy/shoudiantong/ApkEditorLoader$2;->this$0:Lcom/txeasy/shoudiantong/MainActivity;

        invoke-virtual {v2, v0}, Lcom/txeasy/shoudiantong/MainActivity;->startActivity(Landroid/content/Intent;)V

        invoke-interface {p1}, Landroid/content/DialogInterface;->dismiss()V

        return-void

    .end  method

     

    需要植入到取消按钮对应的方法里面的代码,代码中的包路径和类名按照前述方法进行替换后植入。

        move-object/from16 v0, p0

        new-instance v1, Landroid/app/AlertDialog$Builder;

        invoke-direct {v1, v0},  Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V

        const-string  v2, "\u63d0\u793a"

        invoke-virtual {v1, v2},  Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;

        move-result-object v1

        const-string  v2, "\u60a8\u6b63\u5728\u8fd0\u884c\u7684\u7a0b\u5e8f\u662f\u7531\u201c\u5b89\u5353\u4fee\u6539\u5927\u5e08\u201d\u53cd\u7f16\u8bd1\u751f\u6210\uff0c\u672a\u4ed8\u8d39\u7528\u6237\u751f\u6210\u7684\u5e94\u7528\u4f1a\u5f39\u51fa\u672c\u63d0\u793a\u7a97\u53e3\uff0c\u60a8\u9700\u8981\u73b0\u5728\u5c31\u5347\u7ea7\u201c\u5b89\u5353\u4fee\u6539\u5927\u5e08\u201d\u7684VIP\u4f1a\u5458\u5417\uff1f"

        invoke-virtual {v1, v2},  Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;

        move-result-object v1

        const-string  v2, "\u53d6\u6d88"

        new-instance v3, Lcom/txeasy/shoudiantong/ApkEditorLoader$1;

        invoke-direct {v3, v0}, Lcom/txeasy/shoudiantong/ApkEditorLoader$1;-><init>(Lcom/txeasy/shoudiantong/MainActivity;)V

        invoke-virtual {v1, v2,  v3},  Landroid/app/AlertDialog$Builder;->setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;

        move-result-object v1

        const-string  v2, "\u786e\u5b9a"

        new-instance v3, Lcom/txeasy/shoudiantong/ApkEditorLoader$2;

        invoke-direct {v3, v0}, Lcom/txeasy/shoudiantong/ApkEditorLoader$2;-><init>(Lcom/txeasy/shoudiantong/MainActivity;)V

        invoke-virtual {v1, v2,  v3},  Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;

        move-result-object v1

        invoke-virtual {v1},  Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;

        move-result-object v0

        .local v0,  "dialog":Landroid/app/AlertDialog;

        invoke-virtual {v0}, Landroid/app/AlertDialog;->show()V

    上述代码的蓝色部分是提示信息,该信息必须为Unicode格式,例如下面的一句话:

    哈哈~你必须付钱才能关掉我,您确定现在就要付钱吗?

    对应的Unicode是(请自行百度“Unicode编码转换”,会找到一个转换的网站,输入中文会自动转换为unicode,拷贝过来替换即可):

    \u54c8\u54c8\uff5e\u4f60\u5fc5\u987b\u4ed8\u94b1\u624d\u80fd\u5173\u6389\u6211\uff0c\u60a8\u786e\u5b9a\u73b0\u5728\u5c31\u8981\u4ed8\u94b1\u5417\uff1f

    替换包路径和类名的方法,如下图:

    创建好的取消和确认按钮对应的代码文件如下所示:

    需要插入代码的方法(该方法如何定位,前面已经讲过),由于是插入到取消按钮点击后,因此将我们的植入代码拷贝到off方法的调用后面。

    插入后的样子:

    好了,到此为止已经基本大功告成了,我们点击安卓修改大师左侧的打包/签名功能,开始进行打包环节,打包后,系统会自动提示你是否需要安装到手机上。

    下面就是我们的最终成果,安装到手机上并点击关闭手电筒按钮出现的效果。

    您可以用这种方法反编译任何安卓应用哦。只要您愿意,您可以在任何应用上面添加任何功能。后面我们会出教程教大家如何添加任意功能,包括如何进行VIP会员的破解等等。

    安卓优化大师非常强大,有更多更好玩的方法来折腾任何应用。都来玩玩看吧~我相信你一定能够玩出你的新花样。后面我们会推出更多的实例教程,教您如何破解游戏关卡,甚至在应用中添加自己的功能。

     

    展开全文
  • 安卓快速实现dialog(toast)对错控件动画弹窗 博主做的教育类APP,教育类肯定有包含语数英,这些yingshi科目就有做题类型,自然就有相应的做题,校验做题答案需求,有校验判断就有对错之分,怎么比较好的反应并给用户...

    #安卓动画对错弹窗快速实现dialog与toast控件(解析+代码)

    博主做的教育类APP,教育类肯定有包含语数英,这些yingshi科目就有做题类型,自然就有相应的做题,校验做题答案需求,有校验判断就有对错之分,怎么比较好的反应并给用户良好的用户体验,就提出对错动画特效需求了

    下载:本文相应代码

    如图
    对错GIF

    一 步骤之触发页面(MainActivity )

    MainActivity 页面代码

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private Button mBt;
        private Button mBt2;
        private Animation mAnimation;
        private ImageView mImg;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mBt = findViewById(R.id.bt);
            mBt2 = findViewById(R.id.bt2);
            mBt.setOnClickListener(this);
            mBt2.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.bt:
                    new AnimDialog(this);
                    break;
                case R.id.bt2:
                    MyToast.showToast(this, true);
                    break;
            }
        }
    }
    

    MainActivity对应布局页面activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
    
        <Button
            android:id="@+id/bt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="动画实现一"
            />
        <Button
            android:id="@+id/bt2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="动画实现二"
            />
    
    </LinearLayout>
    
    

    二 自定义动画(AnimDialog)

    AnimDialog代码

    public class AnimDialog extends Dialog {
    
        private Context mContext;
        private ImageView mImg;
        private Animation mAnimation;
    
        public AnimDialog(@NonNull Context context) {
            super(context, R.style.dialog_full);
            mContext = context;
            setContentView(R.layout.activity_anim);
            init();
            setOnListener();
        }
    
    
    
        private void setOnListener() {
            mAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                    mImg.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onAnimationEnd(Animation animation) {
                    mImg.setVisibility(View.GONE);
                    dismiss();
                }
    
                @Override
                public void onAnimationRepeat(Animation animation) {
    
                }
            });
        }
    
        private void init() {
            mImg = findViewById(R.id.img1);
            mAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_small);
            mImg.startAnimation(mAnimation);
            
            //按空白处不能取消动画
            setCanceledOnTouchOutside(false);
            show();
        }
    }
    

    AnimDialog 对应布局 activity_anim.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    
        <ImageView
            android:id="@+id/img1"
            android:visibility="visible"
            android:background="@drawable/correct"
            android:layout_centerInParent="true"
            android:layout_width="200dp"
            android:layout_height="200dp"
            />
    
    </RelativeLayout>
    
    

    相关styles.xml

    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
        <!--自定义Dialog样式-->
        <style name="dialog_full">
            <item name="android:windowIsFloating">true</item>   <!--是否悬浮在界面上-->
            <item name="android:windowIsTranslucent">true</item>   <!--是否半透明-->
            <item name="android:windowNoTitle">true</item> <!--是否有标题-->
            <item name="android:windowBackground">@android:color/transparent</item>  <!--窗口背景色透明-->
            <item name="android:backgroundDimEnabled">false</item>  <!--背景是否模糊显示-->
        </style>
    
    </resources>
    
    

    动画anim.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:fillAfter="false">
        <!--fillBefore是指动画结束时画面停留在此动画的第一帧;-->
        <!--fillAfter是指动画结束是画面停留在此动画的最后一帧。-->
    
        <!--
            fromXDelta,fromYDelta   起始时X,Y座标,屏幕右下角的座标是X:320,Y:480
            toXDelta, toYDelta     动画结束时X,Y的座标
            interpolator            指定动画插入器,常见的有
                                    加速减速插入器         accelerate_decelerate_interpolator
                                    加速插入器             accelerate_interpolator,
                                    减速插入器             decelerate_interpolator。
            fromXScale,fromYScale, 动画开始前X,Y的缩放,0.0为不显示,  1.0为正常大小
            toXScale,toYScale,    动画最终缩放的倍数, 1.0为正常大小,大于1.0放大
            pivotX,  pivotY        动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从屏幕中间开始
            startOffset,           动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒
            duration,              一次动画效果消耗的时间,单位毫秒,值越小动画速度越快
            repeatCount,           动画重复的计数,动画将会执行该值+1次
            repeatMode,            动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变
            -->
    
        <!--先放大-->
        <scale
            android:duration="300"
            android:fromXScale="0"
            android:fromYScale="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="1"
            android:toYScale="1" />
        <!--然后缩小-->
        <scale
            android:duration="300"
            android:fromXScale="1"
            android:fromYScale="1"
            android:pivotX="50%"
            android:pivotY="50%"
            android:startOffset="800"
            android:toXScale="0"
            android:toYScale="0" />
    </set>
    
    

    三 自定义动画(MyToast)

    public class MyToast {
    
        private static Animation mAnimation;
    
        @SuppressLint("WrongConstant")
        public static void showToast(Activity activity, Boolean b) {
            LayoutInflater layoutInflater = activity.getLayoutInflater();
            View view = layoutInflater.inflate(R.layout.activity_anim, null);
            final ImageView img = view.findViewById(R.id.img1);
            //设置背景
            if (b) {
    
            } else {
    
            }
    
            mAnimation = AnimationUtils.loadAnimation(activity, R.anim.anim);
            img.startAnimation(mAnimation);
    
            mAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                    img.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onAnimationEnd(Animation animation) {
                    img.setVisibility(View.GONE);
                }
    
                @Override
                public void onAnimationRepeat(Animation animation) {
    
                }
            });
    
            Toast toast = new Toast(activity);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.setDuration(1500);
            toast.setView(view);
            toast.show();
    
        }
    }
    

    尾言

    博主比较喜欢上实例代码,方便有须有的读者,一看就明,Demo与完整核心代码如上.如有不当之处,或者BUG请读者不吝赐教,留言博主,谢谢.
    

    下载:本文相应代码

    展开全文
  • BurpSuite 抓安卓app

    2018-06-16 17:43:00
    认准夜神安卓模拟器,下了几个其他的模拟器都没有代理的功能 一、夜神安卓模拟器设置代理 1.点击右下角的设置 2.点击设置,进入到WIFI连接选项 3.进入列表后,鼠标点击wifi位置,长按左键,会出现一个修改...

    认准夜神安卓模拟器,下了几个其他的模拟器都没有代理的功能

    一、夜神安卓模拟器设置代理

    1.点击右下角的设置

    2.点击设置,进入到WIFI连接选项

    3.进入列表后,鼠标点击wifi位置,长按左键,会出现一个修改网络的弹窗

    4 点击上图中的“修改网络”,勾选"显示高级选项",代理选择“手动”,代理服务器主机名填写你电脑的ip(cmd输入ipconfig),再填写端口。

    二、使用BurpSuite 进行抓包

    三、博主物理机的ip

    参考:https://blog.csdn.net/wudinaniya/article/details/78841564

     

    转载于:https://www.cnblogs.com/zuoxiaolongzzz/p/9190968.html

    展开全文
  • 什么是弹窗?(注:本文所说的“弹窗”仅指Alert 和 Dialog,不包含Actionbar、Toast、Snackbar、Popover)官方解释:Dialogs inform users about a task and can contain critical information, require decisions,...
  • 安卓版本 PX3 Linux3.0 Android7.1 文章目录现象方法1、允许指定名2、若要允许所以APP都不弹框: 现象 方法 文件目录:frameworks/base/packages/SystemUI/src/...
  • 自定义弹窗(自定义 InfoWindow 之后所有的内容更新都需要用户自己完成) - WindowAdapter public class WindowAdapter implements AMap . InfoWindowAdapter , AMap . OnMarkerClickListener , A...
  • 先说思路吧,想实现自动更新版本,最简单就是获取到应用的信息,应用版本号,版本名,然后每次登陆的时候从服务器获取当前apk的版本号和版本名,然后进行判断,不一致证明是新版本,弹出dialog 让用户更新,选择...
  • 应公司要求,要更改名 原项目含微信sdk 改名的话集中在三个地方更改, (1)java的类 rename   (2)微信接口 名.wxapi ...改的过程中会有弹窗提示,直接continue就行了(执行的是默认替换)
  • 前言 Unity手游开发或多或少都会用到Android方面...去谷歌官网下载最新的adb。官方下载 步骤2: 打开cmd输入并执行命令行where adb,可以找到当前使用的adb.exe位置。 步骤3: 打开正在使用的adb文件夹目录,命令...
  • “HMTL一键打包APK工具”可以把网站打包为一个安卓应用APK文件,无需编写任何代码,支持在安卓设备上安装运行。 线上地址: 点击进入页面 历史更新 1.4.5 (2020.2.16) 1. 优化打包逻辑,添加内核标注 2....
  • 微信小程序textarea文本穿透弹窗解决

    千次阅读 2020-06-12 16:37:32
    在ios中不会出现这种问题,而在安卓机会出现。按原本开发想法是textarea组件层级高于弹窗,于是使用z-index进行层级调节。但是发现并没有预料中的解决问题。 分析 看小程序官方文档发现textarea是原生组件,原生组件...
  • 实现过程: ①javascript动态创建节点; ②将参数以innerHTML方式写入; ③以父子集关系,把节点塞进去。...周六下午突然想看看安卓,吃完晚饭后就在搞android studio 的打包apk,到10点还没搞好。
  • IPhone Charles抓Https失败解决方式 转载自:https://blog.csdn.net/zlbook/article/details/81870095 在手机上设置Wifi代理: 打开【设置】>【无线局域网】> 选择已经连接的Wifi, 在页面最下边...
  • 假如你按照网上的教程,在配置好代理的IP地址和端口号,下载并安装了证书,抓仍然显示unnown的话,你要去找下安卓手机怎么信任证书。ios会直接弹窗安卓手机不会,以小米10为例,你需要在设置里面搜索证书,-》CA...
  • 移动端在使用vux框架中popup组件时,安卓上正常,ios上遮罩层挡住弹窗,这是因为滚动元素和mask遮罩层在同一级,vux框架默认把遮罩层放在body标签下,有些人说更改源码,但是改了源码从新打包时会npm所有依赖,所以...
  • 背景:最近在做一个H5签到领红包活动,页面各种弹层显示,产品要求弹层半透明背景下主页面禁止滑动,网上找各种方法,最终确定实现该需求的...部分安卓机型以及 safari 中,无法无法阻止底部页面滚动。 方案二: ...
  • unity3d打包在安卓6.0上的权限问题

    千次阅读 2016-11-06 18:38:20
    1.unity3d在android6.0上的权限问题 2.禁止unity3d获取权限弹窗
  • 1.第一步下载java jdk 1.6以上版本(网上有很多教程)安装java的环境。...当安装成功后,在win+r调出弹窗,输入java或者javac出现下面的样子,就是成功了。如图: 2.安装ADT,(安卓的环境)。网上有关于adt的安
  • vux在安卓是完全没有问题的,但是在ios不兼容,蒙版会遮住主题内容,导致无法对内容进行操作。 解决如下: 1.引入vux封装好的自定义指令 tansferDom 2.使用自定义指令(如果不了解vue的自定义指令,可以参考...
  • 极光推送在国内的App的覆盖率比较高,在第一时间就更新了对...我也是用的安卓端进行演示。 注册极光 先到极光官网,注册账号,配置一下flutter项目的名,如果不记得了,可以到flutter项目下的 android/app/build....
  • 页面有个弹窗,我要实现的效果就是弹窗从底部滑上来,并伴随轻微的抖动效果。 HTML部分: &amp;amp;amp;lt;transition name=&amp;amp;quot;bounce&amp;amp;quot;&amp;amp;amp;gt; &amp;amp;...
  • 由于Aria涉及到文件和网络的操作,因此需要你在manifest文件中添加以下权限,如果你希望在6.0以上的系统中使用Aria,那么你需要动态向安卓系统申请文件系统读写权限,如何使用安卓系统权限 <uses-permission ...
  • 项目需求原生功能,于是把之前的h5封装到安卓的webview中,本来以为稍微封装一下就行,,,唉,都是泪 原生webview,上,完犊子,页面整个垮掉,换方案 1.xwalk 提供一个地址,剩下的自行百度吧,一开始搜的时候...
  • 所以必须要干掉系统默认的导航栏和状态栏,但是系统提供的api只能暂时隐藏,手指下拉或者弹窗还是会冒出来。直接删除systemUI.apk重启虽然可以解决但是太过粗暴,系统壁纸之类炸七杂八的东西都看不到了,于是只能...
  • 安卓指纹支付(指纹识别)

    千次阅读 2018-03-30 09:42:20
    大概流程:(页面弹窗仿支付宝) 开启指纹支付:点击开关按钮,先检索手机里面指纹系统有没有指纹,没有则跳转到手机设置手动去录入指纹,录入完成返回,验证指纹通过后,输入正确的支付密码,则开启指纹支付成功。...
  • 修改名实现分身 实现apk程序分身功能只需要修改如下两个属性: 1、在androidmainfest.xml中的第一行找到package属性,修改名。 2、在androidmainfest.xml中的标签中修改android:authorities属性即可,多个的话,...
  • [503]安卓模拟器怎么设置代理

    千次阅读 2019-01-23 18:18:32
    调试中通常要干的一件事就是抓取,那么想要抓,我们必须要设置代理。 模拟器设置代理的方法: 点击设置,然后进入到wifi连接选项。如图 2.点击wifi 进入列表后,鼠标点击wifi位置,长按左键,会出现一个修改...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

安卓弹窗包