Android TTPod桌面歌词显示效果
?? ? 前段时间听歌使用的应用,发先这效果的,有点像在pc上桌面歌词一样,于是就准备研究研究,今天我把我研究的思路也跟他家说下。
?
?? ? ?首先要准备几样东西:
?? ? ? ? ? ? ? ? ? ? ? 1)apktool
?? ? ? ? ? ? ? ? ? ? ? 2)文本编辑器(geany)
?
??准备好以上工具后我们开始工作:
?
?? ? ? ? 1> "apktool d ttpod.apk /home/ffly" ? ?使用前面的命令吧*.dex反编译成smali
?
?? ? ? ? 2> 分析歌词显示效果,貌似就是在当前界面上添加了一个显示歌词的控件,是不是有点类似Toast呢?
?
?? ? ? ? 3>既然是添加上去的,那么我们根据这个来试下在smali里面是不是会有个addview方法呢?我们去查找一下(使用geany)
?? ? ? ? ? ? 查找结果如下:
?
?? ? ? ? ? ? FloatWindow.smali 文件 ? ? ?763行 ?handleShow()方法里面
? ? ? ?invoke-interface {v1, v2, v0}, Landroid/view/WindowManager;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
?
?? ? ? ? ? ? ?从结果上可以看出这里使用的是WindowManager.addView(View view,ViewGroup.LayoutParams params);
?? ? ? ? ? ? 好,现在我们知道是怎么添加上去的,那么我们现在就开始寻找所需要的参数吧,千万别看到现在就以为OK了哦,好戏还在后面 哈哈。
?
?? ? ? ? 4>我们继续查看handleShow()方法找到传进去的参数,我找到如下方法被掉用:
?
?? ? ? ? ? ? ?FloatWindow.smali 文件 ? ? ?705行 ?handleShow()方法里面
?
?
?
invoke-direct {p0}, Lcom/sds/android/ttpod/extend/minilyric/FloatWindow;->createLayout()Landroid/view/WindowManager$LayoutParams;
?
?? ?move-result-object v0
?
?? ? ? ? ? ? ?从上面看出来,参数是从createLayout()方法的返回值(WindowManager.LayoutParams)
?
?
?? ? ? ? ? ? ?=====================================================
?
?? ? ? ? ? ? ? ? ??.method private createLayout()Landroid/view/WindowManager$LayoutParams;
?? ?.locals 3
?
?? ?.prologue
?? ?.line 240
?? ?new-instance v0, Landroid/view/WindowManager$LayoutParams;
?
?? ?invoke-direct {v0}, Landroid/view/WindowManager$LayoutParams;-><init>()V
?
?? ?.line 242
?? ?.local v0, p:Landroid/view/WindowManager$LayoutParams;
?? ?const/16 v1, 0x53
?
?? ?iput v1, v0, Landroid/view/WindowManager$LayoutParams;->gravity:I
?
?? ?.line 243
?? ?iget v1, p0, Lcom/sds/android/ttpod/extend/minilyric/FloatWindow;->mWidth:I
?
?? ?iput v1, p0, Lcom/sds/android/ttpod/extend/minilyric/FloatWindow;->mLastWidth:I
?
?? ?iput v1, v0, Landroid/view/WindowManager$LayoutParams;->width:I
?
?? ?.line 244
?? ?iget v1, p0, Lcom/sds/android/ttpod/extend/minilyric/FloatWindow;->mHeight:I
?
?? ?iput v1, p0, Lcom/sds/android/ttpod/extend/minilyric/FloatWindow;->mLastHeight:I
?
?? ?iput v1, v0, Landroid/view/WindowManager$LayoutParams;->height:I
?
?? ?.line 246
?? ?const/4 v1, -0x3
?
?? ?iput v1, v0, Landroid/view/WindowManager$LayoutParams;->format:I
?
?? ?.line 248
?? ?iget v1, v0, Landroid/view/WindowManager$LayoutParams;->flags:I
?
?? ?invoke-direct {p0, v1}, Lcom/sds/android/ttpod/extend/minilyric/FloatWindow;->computeFlags(I)I
?
?? ?move-result v1
?
?? ?iput v1, v0, Landroid/view/WindowManager$LayoutParams;->flags:I
?
?? ?.line 249
?? ?const/16 v1, 0x7d3
?
?? ?iput v1, v0, Landroid/view/WindowManager$LayoutParams;->type:I
?
?? ?.line 250
?? ?const/4 v1, 0x0
?
?? ?iput-object v1, v0, Landroid/view/WindowManager$LayoutParams;->token:Landroid/os/IBinder;
?
?? ?.line 251
?? ?new-instance v1, Ljava/lang/StringBuilder;
?
?? ?const-string v2, "FloatWindow:"
?
?? ?invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
?
?? ?invoke-virtual {p0}, Ljava/lang/Object;->hashCode()I
?
?? ?move-result v2
?
?? ?invoke-static {v2}, Ljava/lang/Integer;->toHexString(I)Ljava/lang/String;
?
?? ?move-result-object v2
?
?? ?invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
?
?? ?move-result-object v1
?
?? ?invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
?
?? ?move-result-object v1
?
?? ?invoke-virtual {v0, v1}, Landroid/view/WindowManager$LayoutParams;->setTitle(Ljava/lang/CharSequence;)V
?
?? ?.line 253
?? ?return-object v0
.end method
===============================================================
?
?? ? ? ? ? 上面就是我们找到的方法了,只要吧相应的参数设置好就OK,否则是看不到效果的哦,具体解释我就不说了,我直接提供源码给大家,倒是后自己对照这看 ?呵呵。
?
?? ? ? ? ?5>说到这也就差不多完成了,大家还记得我前面提到的Toast吗?呵呵,有兴趣自己看下Toast源码,你就能着到这个效果了.
有空你就多来逛逛 哈哈!