Android Animtaion 仿搜狗输入法的精品市场 一键安装dialog弹出效果,反编译使用

转载请说明出处:http://blog.csdn.net/lsmfeixiang/article/details/43019507


之前用手机测试的时候,无意间发现搜狗输入法的精品市场,进入之后,会弹出一个一键安装的dialog,然后主界面就会执行一个缩放并旋转的动画。先看下效果,点击图片跳转过去看



看了看,分析一下,应该是缩放和旋转动画,code大致知道 怎么写,但是我开始想的方法比较笨而且不完善,效果很差,那就去看看搜狗是怎么做的吧。

首先肯定是需要工具Decompile Tools


1、下载搜狗输入法.apk,copy进apktool文件夹,然后cmd进入该文件夹加,执行命令,apktool d -s xxx.apk


报的exception不用关心,只用去看反编译出来的结果啥样,进入xxx文件夹看一下


看来搜狗的apk经过处理了,正常情况下,应该有classes.dex以及各个资源夹,不过没关系,如果需要使用它们的资源,可以直接zip解压这个apk就可以了


2、把dex文件转成.jar:把classes.dex copy到dex2jar文件夹,然后cmd进去,执行命令 dex2jar.bat classes.dex,然后生成classes_dex2jar.jar文件


3、把classes_dex2jar.jar转为代码文件,使用jd-jui打开这个jar文件


code的目录结构 就是这样了,然后file->save all resouce 保存成一个zip。


code有了,那么我们就开始分析code在什么位置

1、手机连接上pc,然后使用android tool hierarchyviewer,点击到搜狗的精品市场的界面,然后查看运行在任务栈顶的app的activity的包名全路径,经查是MainActivity


2、然后把上面保存的code解压出来,随便新建一个java项目然后,导入到Eclipse,定位一下



然后查看code,很容易的发现了一个方法


可以看到有一个工具类,AnimationUtil

3、去看下AnimationUtil这个类


果然是有两个关于animation的方法


详细看一下其中一个方法,使用的果然是ObjectAnmitor,然后x轴 y轴缩放,x轴旋转,和Y轴位移,然后最后playTogether,就可以了。


这样就搞定了,然后新建一个android项目

主界面add一个fragment,然后单击一个button,弹出一个dialog,同时执行我们分析出来的动画,code如下:

 getView().findViewById(R.id.show).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog();
            }
        });

   protected void showDialog() {
        MDialogFragment dialogFragment = new MDialogFragment();
        dialogFragment.setDismssListener(dismissListener);
        dialogFragment.show(getFragmentManager(), "DIALOG");
        
        long duration = 500;
        Display display = getActivity().getWindowManager().getDefaultDisplay();
        FrameLayout frameLayout = (FrameLayout) getActivity().findViewById(R.id.root_content);
        float[] scale = new float[2];
        scale[0] = 1.0f;
        scale[1] = 0.8f;
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(frameLayout, "scaleX", scale).setDuration(duration);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(frameLayout, "scaleY", scale).setDuration(duration);
        float[] rotation = new float[]{0,10,0};
        ObjectAnimator rotationX = ObjectAnimator.ofFloat(frameLayout, "rotationX", rotation).setDuration(duration);
        
        float[] translation = new float[1];
        translation[0] = -display.getWidth() * 0.2f / 2;
        ObjectAnimator translationY = ObjectAnimator.ofFloat(frameLayout, "translationY",translation).setDuration(duration);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(scaleX,scaleY,rotationX,translationY);
        animatorSet.setTarget(frameLayout);
        animatorSet.start();
    }
恢复的动画和上面是刚好相反的

  protected void hideAnimator() {
        long duration = 500;
        FrameLayout frameLayout = (FrameLayout) getActivity().findViewById(R.id.root_content);
        float[] scale = new float[2];
        scale[0] = 0.8f;
        scale[1] = 1.0f;
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(frameLayout, "scaleX", scale).setDuration(duration);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(frameLayout, "scaleY", scale).setDuration(duration);
        float[] rotation = new float[]{0,10,0};
        ObjectAnimator rotationX = ObjectAnimator.ofFloat(frameLayout, "rotationX", rotation).setDuration(duration);
        
        float[] translation = new float[1];
        translation[0] = 0;
        ObjectAnimator translationY = ObjectAnimator.ofFloat(frameLayout, "translationY",translation).setDuration(duration);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(scaleX,scaleY,rotationX,translationY);
        animatorSet.setTarget(frameLayout);
        animatorSet.start();        
    }


dialogfragment的code:

public class MDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        View v = inflater.inflate(R.layout.dialog, null);
        AlertDialog dialog = new AlertDialog.Builder(getActivity())
                .setPositiveButton("OK", new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                }).setView(v).create();
        Window window = dialog.getWindow();
        window.setGravity(Gravity.BOTTOM);
        LayoutParams attributes = window.getAttributes();
        Display display = dialog.getWindow().getWindowManager().getDefaultDisplay();
        attributes.width = display.getWidth();
        attributes.height = -1;
        window.setAttributes(attributes);
        window.setWindowAnimations(R.style.DialogAnimation);
        return dialog;
    }
    
    
    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if(dismissListener != null){
            dismissListener.onDismiss(dialog);
        }
    }
    
    // 不能在<span style="font-family: Arial, Helvetica, sans-serif;">onCreateDialog中给dialog直接设置</span><span style="font-family: Arial, Helvetica, sans-serif;">OnDismissListener,否则会报错,所以就利用DialogFragment自己的ondismiss方法来实现一个listener</span><span style="font-family: Arial, Helvetica, sans-serif;">
</span>    private OnDismissListener dismissListener;
    public void setDismssListener(OnDismissListener dismissListener){
        this.dismissListener = dismissListener;
    }
}


搞定了,放一张效果图(点击跳转过去看效果)




点击下载源码


点击下载反编译工具

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值