公司最开始设计的草图里面,有个省份选择的Gridview,最初就是想通过Adapter里面getView返回带边框的View
后来通过GridView设置水平垂直间距解决,让背景为黑色,然后设置间距,就露出下面的背景,看起来跟边框效果一样
但是后面的各种表格的设计让我觉得 我还是的去做一个带边框的TextView
网上查了下,写的人也蛮多的,我就整理个demo出来吧,反正是当做自己的积累
思路很简单,在TextView的onDraw里面drawRec就可以了~
我在这个基础上扩充了下,设置边框颜色以及粗细,顺便学习了下自定义控件的属性设置
上效果图吧,中间是一个较粗的绿色的边框,下面是一个红色较细的边框
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawStroke(canvas); }
是的,只是在onDraw里面花一个矩形就可以~
private void drawStroke(Canvas canvas) { Rect rect = new Rect(); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(mStrokeColor);//设置画笔颜色 paint.setStrokeWidth(mStrokeWidth);//设置画笔粗细 getLocalVisibleRect(rect); canvas.drawRect(rect, paint); }
为了显摆一下在里面加入了边框颜色以及粗细的控制,当然你也完全可以不设置,有默认的
private int mStrokeColor; private float mStrokeWidth; public TextViewStroke(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.stroke); mStrokeColor = typedArray.getInt(R.styleable.stroke_strokeColor,Color.BLACK); mStrokeWidth = typedArray.getDimension(R.styleable.stroke_strokeWidth, 2); typedArray.recycle(); }
好吧,我也是刚学自定义,那个R.styleable.stroke就是我们定义的可以在xml布局里面设置的属性就像这样
<com.zig.textviewstroke.TextViewStroke android:layout_width="100dp" android:layout_height="100dp" android:gravity="center" android:layout_centerInParent="true" android:text="zig 出品" stroke:strokeColor = "#3b7d19" stroke:strokeWidth = "5dp"/>
最后那两行的自定义属性就是在R.styleable.stroke这里面自己设置的,你可以设置任何你想要的属性,然后在你控件那个类里面进行取得相应的值就可以
R.styleable.stroke这个值对应的文件在values的attrs.xml里面
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="stroke"> <attr name="strokeColor" format="color"/> <attr name="strokeWidth" format="dimension"/> </declare-styleable> </resources>
注意,在布局里面使用自定义组件时候,如果用自己的属性,要控件所在的布局文件的xml中写出你的namespace也就是stroke:strokeColor的前面那个stroke
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:stroke="http://schemas.android.com/apk/res/com.zig.textviewstroke" android:layout_width="match_parent" android:layout_height="match_parent" >
当你实际用的时候把最后面那个包名改成你自己控件对应位置的包名就可以
貌似说清楚了... #83
好吧就这样,工程在附件中,自己捉摸下,有好建议,欢迎联系我
这几天项目需要用到代码混淆来给项目代码提高安全性,由于项目忙,稍有研究,涉及不深;
略有收获,浅显总结,以备遗忘。
大家都知道,没有经过混淆的APK,加压后,可以直接将APK加压后的 classes.dex 文件反
编译成jar包,然后就可以对其中的关键代码与实现一览无余。
现在来看看,如何将APK反编译出来:
1、将APK解压出来,会有一个 classes.dex 文件
2、得到了 clases.dex 文件,将其 还原成 .jar 包,这一步需要用到一个工具 --dex2jar
(谷歌的代码库里有 http://code.google.com/p/dex2jar/)
将其下载下来,然后解压,解压目录中会有一个 dex2jar.bat
将 1 中解压出的classe.dex 拷贝到dex2jar的解压目录中,然后在命令行执行
"dex2jar.bat classes.dex",之后在解压目录中会看到多出一个名叫“classes.dex.dex2jar.jar”
的jar文件
3、查看 .jar 文件,这一步就是传统的反编译了,我们需要用到一个辅助工具 :jd-gui
(http://java.decompiler.free.fr/?q=jdgui)
下载后,用jd-gui 打开.jar 文件,就能查看到反编译后的代码了
没有经过混淆的项目,反编译之后的代码和你项目中的代码相差无几了。
现在来讲讲如何混淆代码:
现在看android-sdks\tools目录下,会有一个proguard文件夹
这里google已经做了很多,但是是在2.3及其以后的版本。
在进入proguard文件夹,会有一个proguard-android.txt文件
这个就是google默认的混淆代码的默认配置文件(虽说是默认,但还是需要在android工程中开启)
接下来在新建的Android工程目录下 会有 两个配置文件 分别是project.properties 和 proguard-android.txt(注意2.3和4.0以后版本这两个文件名有略微区别),这里就需要在project.properties开启混淆代码设置,看到这句没:
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
将下面这句注释取消掉,意思就是执行 android-sdks/tools/proguard/proguard-android.txt 和你项目当前目录下得proguard-android.txt文件中的操作。
基本数据类型:
int long double float byte char boolean short
引用数据类型:
Integer Double FLoat String
java数据类型图:
┏数值型━┳━整数型:byte short int long
┏基本数据类型━━┫ ┗━浮点型:float double
┃ ┣字符型:char
数据类型╋ ┗布尔型:boolean
┃ ┏类(class)
┗引用数据类型━━╋接口(interface)
┗数组(array