From d98eb8cca5b7edc10e2ddff70efafe120b8a539c Mon Sep 17 00:00:00 2001 From: Huqiu Liao Date: Fri, 25 Sep 2015 22:53:46 -0700 Subject: [PATCH 01/27] Fix #10 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3238ce2..d230fdc 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Android Gems](http://www.android-gems.com/badge/tianshaojie/AndroidFine.svg?branch=master)](http://www.android-gems.com/lib/tianshaojie/AndroidFine) + # AndroidFine,Android快速开发框架 ## UI组件,不止是简单整合,更易用 From 5426555c731e1bcb4fdea8d94a79db65280e8e4a Mon Sep 17 00:00:00 2001 From: tiansj Date: Fri, 27 Nov 2015 10:26:04 +0800 Subject: [PATCH 02/27] NoObfuscateInterface -> NotObfuscateInterface --- app/build.gradle | 7 ++++--- app/proguard-rules.pro | 4 ++-- ...oObfuscateInterface.java => NotObfuscateInterface.java} | 2 +- app/src/main/java/com/yuzhi/fine/model/Coordinate.java | 4 ++-- app/src/main/java/com/yuzhi/fine/model/SearchParam.java | 4 ++-- app/src/main/java/com/yuzhi/fine/model/SearchShop.java | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) rename app/src/main/java/com/yuzhi/fine/common/{NoObfuscateInterface.java => NotObfuscateInterface.java} (74%) diff --git a/app/build.gradle b/app/build.gradle index fc3f22f..4e5fe41 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 + compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.yuzhi.fine" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } @@ -48,12 +48,13 @@ dependencies { compile 'com.jakewharton:butterknife:7.0.1' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.picasso:picasso:2.5.2' + compile 'com.github.bumptech.glide:glide:3.6.1' compile 'com.alibaba:fastjson:1.1.34.android' compile 'com.j256.ormlite:ormlite-android:4.48' compile 'com.j256.ormlite:ormlite-core:4.48' compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' - compile 'com.android.support:support-v4:22.2.1' compile 'in.srain.cube:ultra-ptr:1.0.10' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' + compile 'com.android.support:support-v4:22.2.1' } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5f601bc..3c3b07b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -44,8 +44,8 @@ -keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *; } ##################upper is for common android --keep public interface com.yuzhi.fine.common.NoObfuscateInterface{public *;} --keep class * implements com.yuzhi.fine.common.NoObfuscateInterface{ +-keep public interface com.yuzhi.fine.common.NotObfuscateInterface{public *;} +-keep class * implements com.yuzhi.fine.common.NotObfuscateInterface{ ; ; } diff --git a/app/src/main/java/com/yuzhi/fine/common/NoObfuscateInterface.java b/app/src/main/java/com/yuzhi/fine/common/NotObfuscateInterface.java similarity index 74% rename from app/src/main/java/com/yuzhi/fine/common/NoObfuscateInterface.java rename to app/src/main/java/com/yuzhi/fine/common/NotObfuscateInterface.java index e6d7223..dad623e 100644 --- a/app/src/main/java/com/yuzhi/fine/common/NoObfuscateInterface.java +++ b/app/src/main/java/com/yuzhi/fine/common/NotObfuscateInterface.java @@ -2,5 +2,5 @@ /** * 实现或继承此接口的类,其共有属性和方法将不参与混淆 */ -public interface NoObfuscateInterface { +public interface NotObfuscateInterface { } diff --git a/app/src/main/java/com/yuzhi/fine/model/Coordinate.java b/app/src/main/java/com/yuzhi/fine/model/Coordinate.java index ba7c17d..c84c8fd 100644 --- a/app/src/main/java/com/yuzhi/fine/model/Coordinate.java +++ b/app/src/main/java/com/yuzhi/fine/model/Coordinate.java @@ -1,6 +1,6 @@ package com.yuzhi.fine.model; -import com.yuzhi.fine.common.NoObfuscateInterface; +import com.yuzhi.fine.common.NotObfuscateInterface; import java.io.Serializable; @@ -9,7 +9,7 @@ * User: tiansj * DateTime: 14-1-3 下午4:49 */ -public class Coordinate implements Serializable, NoObfuscateInterface { +public class Coordinate implements Serializable, NotObfuscateInterface { private double lng; private double lat; diff --git a/app/src/main/java/com/yuzhi/fine/model/SearchParam.java b/app/src/main/java/com/yuzhi/fine/model/SearchParam.java index 73b0b0c..836343c 100644 --- a/app/src/main/java/com/yuzhi/fine/model/SearchParam.java +++ b/app/src/main/java/com/yuzhi/fine/model/SearchParam.java @@ -1,11 +1,11 @@ package com.yuzhi.fine.model; import com.alibaba.fastjson.JSON; -import com.yuzhi.fine.common.NoObfuscateInterface; +import com.yuzhi.fine.common.NotObfuscateInterface; import java.io.Serializable; -public class SearchParam implements Serializable, NoObfuscateInterface { +public class SearchParam implements Serializable, NotObfuscateInterface { public static final int SORT_GRADE = 0; // 评分由高到低(默认按评分) public static final int SORT_TIME = 1; // 人气由高到低(按人气) diff --git a/app/src/main/java/com/yuzhi/fine/model/SearchShop.java b/app/src/main/java/com/yuzhi/fine/model/SearchShop.java index 8f95774..4ab1436 100644 --- a/app/src/main/java/com/yuzhi/fine/model/SearchShop.java +++ b/app/src/main/java/com/yuzhi/fine/model/SearchShop.java @@ -1,6 +1,6 @@ package com.yuzhi.fine.model; -import com.yuzhi.fine.common.NoObfuscateInterface; +import com.yuzhi.fine.common.NotObfuscateInterface; import java.io.Serializable; import java.util.List; @@ -10,7 +10,7 @@ * User: tiansj * DateTime: 14-1-3 下午4:49 */ -public class SearchShop implements Serializable, NoObfuscateInterface { +public class SearchShop implements Serializable, NotObfuscateInterface { public static final int TYPE_OUTSIDE = 0; // 外部商家 public static final int TYPE_INSIDE = 1; // 内部商家 From 350a0f575b85b31a65ebea256361b17863667adb Mon Sep 17 00:00:00 2001 From: tiansj Date: Fri, 27 Nov 2015 10:26:15 +0800 Subject: [PATCH 03/27] BitmapUtil --- .../java/com/yuzhi/fine/utils/BitmapUtil.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 app/src/main/java/com/yuzhi/fine/utils/BitmapUtil.java diff --git a/app/src/main/java/com/yuzhi/fine/utils/BitmapUtil.java b/app/src/main/java/com/yuzhi/fine/utils/BitmapUtil.java new file mode 100644 index 0000000..b02ecf0 --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/utils/BitmapUtil.java @@ -0,0 +1,56 @@ +package com.yuzhi.fine.utils; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +/** + * Created by tiansj on 15/11/16. + */ +public class BitmapUtil { + + private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { + final int height = options.outHeight; + final int width = options.outWidth; + int inSampleSize = 1; + if (height > reqHeight || width > reqWidth) { + final int halfHeight = height / 2; + final int halfWidth = width / 2; + while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { + inSampleSize *= 2; + } + } + return inSampleSize; + } + + // 如果是放大图片,filter决定是否平滑,如果是缩小图片,filter无影响 + private static Bitmap createScaleBitmap(Bitmap src, int dstWidth, int dstHeight) { + Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false); + if (src != dst) { // 如果没有缩放,那么不回收 + src.recycle(); // 释放Bitmap的native像素数组 + } + return dst; + } + + // 从Resources中加载图片 + public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeResource(res, resId, options); // 读取图片长款 + options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 计算inSampleSize + options.inJustDecodeBounds = false; + Bitmap src = BitmapFactory.decodeResource(res, resId, options); // 载入一个稍大的缩略图 + return createScaleBitmap(src, reqWidth, reqHeight); // 进一步得到目标大小的缩略图 + } + + // 从sd卡上加载图片 + public static Bitmap decodeSampledBitmapFromFd(String pathName, int reqWidth, int reqHeight) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(pathName, options); + options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); + options.inJustDecodeBounds = false; + Bitmap src = BitmapFactory.decodeFile(pathName, options); + return createScaleBitmap(src, reqWidth, reqHeight); + } +} From 2a207c4c320ebd375527c11f25d411db96c0e70d Mon Sep 17 00:00:00 2001 From: tiansj Date: Fri, 27 Nov 2015 10:27:32 +0800 Subject: [PATCH 04/27] ignore --- .gitignore | 104 +++++++++++++++++++++++++++++++++++++++++++++++ app/app.iml | 16 ++++++-- local.properties | 2 +- 3 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6c07995 --- /dev/null +++ b/.gitignore @@ -0,0 +1,104 @@ + +.gradle/2.4/taskArtifacts/cache.properties + +.gradle/2.4/taskArtifacts/cache.properties.lock + +.gradle/2.4/taskArtifacts/fileHashes.bin + +.gradle/2.4/taskArtifacts/fileSnapshots.bin + +.gradle/2.4/taskArtifacts/outputFileStates.bin + +.gradle/2.4/taskArtifacts/taskArtifacts.bin + +.idea/.name + +.idea/compiler.xml + +.idea/copyright/profiles_settings.xml + +.idea/gradle.xml + +.idea/libraries/butterknife_7_0_1.xml + +.idea/libraries/fastjson_1_1_34_android.xml + +.idea/libraries/okhttp_2_4_0.xml + +.idea/libraries/okio_1_4_0.xml + +.idea/libraries/ormlite_android_4_48.xml + +.idea/libraries/ormlite_core_4_48.xml + +.idea/libraries/picasso_2_5_2.xml + +.idea/libraries/support_annotations_22_2_1.xml + +.idea/libraries/systembartint_1_0_3.xml + +.idea/libraries/support_v4_22_2_1.xml + +.idea/misc.xml + +.idea/modules.xml + +.idea/runConfigurations.xml + +.idea/vcs.xml + +.idea/workspace.xml + +app/app.iml + +build/intermediates/gradle_project_sync_data.bin + +build/intermediates/dex-cache/cache.xml + +app/app.iml + +app/app.iml + +local.properties + +.idea/libraries/leakcanary_watcher_1_3.xml + +.idea/libraries/leakcanary_android_1_3.xml + +.idea/libraries/leakcanary_analyzer_1_3.xml + +.idea/libraries/haha_1_1.xml + +app/app.iml + +local.properties + +.gradle/2.2.1/taskArtifacts/fileSnapshots.bin + +.gradle/2.2.1/taskArtifacts/outputFileStates.bin + +.gradle/2.2.1/taskArtifacts/taskArtifacts.bin + +.idea/libraries/ultra_ptr_1_0_10.xml + +build/intermediates/lint-cache/api-versions-6-22.bin + +build/intermediates/lint-cache/typos-en.txt-2.bin + +local.properties + +.gradle/2.2.1/taskArtifacts/cache.properties + +.gradle/2.2.1/taskArtifacts/cache.properties.lock + +.gradle/2.2.1/taskArtifacts/fileHashes.bin + +app/app.iml + +.idea/libraries/glide_3_6_1.xml + +app/app.iml + +app/app.iml + +local.properties diff --git a/app/app.iml b/app/app.iml index e03e14c..0b433ea 100644 --- a/app/app.iml +++ b/app/app.iml @@ -72,6 +72,8 @@ + + @@ -87,17 +89,23 @@ - + - + + - + - + + + + + + \ No newline at end of file diff --git a/local.properties b/local.properties index 5981e99..3539d08 100644 --- a/local.properties +++ b/local.properties @@ -7,5 +7,5 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -#Sun Aug 23 15:08:21 CST 2015 +#Mon Oct 26 10:14:22 CST 2015 sdk.dir=/usr/local/android-sdk From 9f65f9460176afd2f31cf76e2d83e023a7fd5f3c Mon Sep 17 00:00:00 2001 From: tiansj Date: Fri, 27 Nov 2015 11:18:45 +0800 Subject: [PATCH 05/27] readme add donate --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3238ce2..b3b9d40 100644 --- a/README.md +++ b/README.md @@ -36,5 +36,7 @@ [Download AndroidFine.apk](http://files.cnblogs.com/files/purediy/AndroidFine.apk) +## 捐赠 +![](https://tfsimg.alipay.com/images/mobilecodec/T16gVjXXRiXXXXXXXX) From 755b4310919baccba7bbd757ed436e0179376c57 Mon Sep 17 00:00:00 2001 From: tiansj Date: Thu, 10 Dec 2015 10:02:55 +0800 Subject: [PATCH 06/27] =?UTF-8?q?=E5=88=A0=E9=99=A4manifset=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 62 -------------------------------- 1 file changed, 62 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aadbe64..e0525e9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,63 +24,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -102,9 +45,4 @@ - - - - - From 73afdc3415ab7ae63fa7771381454749844ee291 Mon Sep 17 00:00:00 2001 From: tiansj Date: Thu, 10 Dec 2015 10:44:09 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E5=87=8F=E5=B0=91=E8=BF=87=E5=BA=A6?= =?UTF-8?q?=E7=BB=98=E5=88=B6=EF=BC=8C=E4=BC=98=E5=8C=96UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.iml | 15 ++++----------- .../com/yuzhi/fine/fragment/DemoPtrFragment.java | 1 + app/src/main/res/drawable/list_item_selector.xml | 8 ++++++++ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/fragment_demo_ptr.xml | 3 --- app/src/main/res/layout/fragment_home_pager.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- 7 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/drawable/list_item_selector.xml diff --git a/app/app.iml b/app/app.iml index 0b433ea..250b3d6 100644 --- a/app/app.iml +++ b/app/app.iml @@ -65,27 +65,20 @@ - - + - - - - - - - + @@ -96,11 +89,11 @@ - - + + diff --git a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java index 81e56b9..e66a843 100644 --- a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java +++ b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java @@ -86,6 +86,7 @@ protected void convert(BaseAdapterHelper helper, SearchShop shop) { final StoreHouseHeader header = new StoreHouseHeader(context); header.setPadding(0, DeviceUtil.dp2px(context, 15), 0, 0); header.initWithString("Fine"); + header.setTextColor(getResources().getColor(R.color.gray)); mPtrFrame.setHeaderView(header); mPtrFrame.addPtrUIHandler(header); // header custom end diff --git a/app/src/main/res/drawable/list_item_selector.xml b/app/src/main/res/drawable/list_item_selector.xml new file mode 100644 index 0000000..cef1740 --- /dev/null +++ b/app/src/main/res/drawable/list_item_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b97708c..4f71745 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/fragment_demo_ptr.xml b/app/src/main/res/layout/fragment_demo_ptr.xml index 9ba3e18..1f8e4f9 100644 --- a/app/src/main/res/layout/fragment_demo_ptr.xml +++ b/app/src/main/res/layout/fragment_demo_ptr.xml @@ -9,7 +9,6 @@ android:id="@+id/rotate_header_list_view_frame" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/gray" cube_ptr:ptr_duration_to_close="300" cube_ptr:ptr_duration_to_close_header="2000" cube_ptr:ptr_keep_header_when_refresh="true" @@ -22,10 +21,8 @@ android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background_color" style="@style/CommonListViewStyle" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_pager.xml b/app/src/main/res/layout/fragment_home_pager.xml index dfdea47..5cf0027 100644 --- a/app/src/main/res/layout/fragment_home_pager.xml +++ b/app/src/main/res/layout/fragment_home_pager.xml @@ -4,7 +4,7 @@ android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:background="@color/white"> + android:background="@null"> @drawable/list_view_divider - @color/gray_light + @drawable/list_item_selector none none false From 0cdb38e047a6bb41005eb6280c765731b79fa4e4 Mon Sep 17 00:00:00 2001 From: tiansj Date: Wed, 13 Jan 2016 11:48:56 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E6=AF=9B=E7=8E=BB=E7=92=83=E6=95=88?= =?UTF-8?q?=E6=9E=9C=EF=BC=8C=E4=BD=BF=E7=94=A8FastBlurFragment/RSBlurFrag?= =?UTF-8?q?ment=EF=BC=8C=E7=9C=8B=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.iml | 8 +- .../yuzhi/fine/fragment/DemoPtrFragment.java | 104 +++++++- .../yuzhi/fine/fragment/FastBlurFragment.java | 136 ++++++++++ .../yuzhi/fine/fragment/RSBlurFragment.java | 137 ++++++++++ .../java/com/yuzhi/fine/ui/blur/FastBlur.java | 244 ++++++++++++++++++ .../fine/ui/blur/ZoomOutPageTransformer.java | 46 ++++ .../main/res/layout/activity_house_detail.xml | 2 +- app/src/main/res/layout/activity_main.xml | 8 +- .../res/layout/activity_touch_gallery.xml | 2 +- app/src/main/res/layout/fragment_layout.xml | 30 +++ .../main/res/layout/layout_main_footer.xml | 42 +++ ...main_header.xml => layout_main_header.xml} | 0 app/src/main/res/layout/main_footer.xml | 42 --- 13 files changed, 746 insertions(+), 55 deletions(-) create mode 100755 app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java create mode 100755 app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java create mode 100755 app/src/main/java/com/yuzhi/fine/ui/blur/FastBlur.java create mode 100755 app/src/main/java/com/yuzhi/fine/ui/blur/ZoomOutPageTransformer.java create mode 100755 app/src/main/res/layout/fragment_layout.xml create mode 100644 app/src/main/res/layout/layout_main_footer.xml rename app/src/main/res/layout/{main_header.xml => layout_main_header.xml} (100%) delete mode 100644 app/src/main/res/layout/main_footer.xml diff --git a/app/app.iml b/app/app.iml index 250b3d6..211dc43 100644 --- a/app/app.iml +++ b/app/app.iml @@ -64,6 +64,7 @@ + @@ -72,6 +73,7 @@ + @@ -89,11 +91,13 @@ - + - + + + diff --git a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java index e66a843..b7fba11 100644 --- a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java +++ b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java @@ -1,6 +1,5 @@ package com.yuzhi.fine.fragment; -import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -16,6 +15,7 @@ import com.squareup.okhttp.Request; import com.squareup.picasso.Picasso; import com.yuzhi.fine.R; +import com.yuzhi.fine.activity.MainActivity; import com.yuzhi.fine.http.HttpClient; import com.yuzhi.fine.http.HttpResponseHandler; import com.yuzhi.fine.model.SearchParam; @@ -35,15 +35,13 @@ import in.srain.cube.views.ptr.PtrDefaultHandler; import in.srain.cube.views.ptr.PtrFrameLayout; import in.srain.cube.views.ptr.PtrHandler; -import in.srain.cube.views.ptr.PtrUIHandler; import in.srain.cube.views.ptr.header.StoreHouseHeader; -import in.srain.cube.views.ptr.indicator.PtrIndicator; /** * Created by tiansj on 15/9/4. */ public class DemoPtrFragment extends Fragment { - private Activity context; + private MainActivity context; private SearchParam param; private int pno = 1; @@ -65,7 +63,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - context = getActivity(); + context = (MainActivity) getActivity(); initData(); initView(); loadData(); @@ -80,6 +78,7 @@ protected void convert(BaseAdapterHelper helper, SearchShop shop) { .setImageUrl(R.id.logo, shop.getLogo()); // 自动异步加载图片 } }; + listView.setDrawingCacheEnabled(true); listView.setAdapter(adapter); // header custom begin @@ -135,10 +134,105 @@ public void onScrollStateChanged(AbsListView view, int scrollState) { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + // getLastVisibleItemBitmap(firstVisibleItem+visibleItemCount); +// takeScreenShot(context); } }); + } +// public void takeScreenShot(Activity activity) { +// // View是你需要截图的View +// View view = activity.getWindow().getDecorView(); +// view.setDrawingCacheEnabled(true); +// view.buildDrawingCache(); +// Bitmap b1 = view.getDrawingCache(); +// +// // 获取状态栏高度 +// Rect frame = new Rect(); +// activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); +// int statusBarHeight = frame.top; +// System.out.println(statusBarHeight); +// +// // 获取屏幕长和高 +// int width = activity.getWindowManager().getDefaultDisplay().getWidth(); +// int height = activity.getWindowManager().getDefaultDisplay().getHeight(); +// // 去掉标题栏 +//// Bitmap b = Bitmap.createBitmap(b1, 0, height-120, width, 120); +// Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height +// - statusBarHeight); +// view.destroyDrawingCache(); +// context.blurFooterBar(b); +//// return b; +// } +// +// private void getLastVisibleItemBitmap(int pos) { +// View childView = adapter.getView(pos, null, listView); +// if(childView == null) { +// return; +// } +// childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY), +// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); +// +// childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight()); +// childView.setDrawingCacheEnabled(true); +// childView.buildDrawingCache(); +//// return childView.getDrawingCache(); +// context.blurFooterBar(childView.getDrawingCache()); +// } +// +// public Bitmap getWholeListViewItemsToBitmap() { +// int itemscount = adapter.getCount(); +// int allitemsheight = 0; +// List bmps = new ArrayList(); +// +// for (int i = 0; i < itemscount; i++) { +// +// View childView = adapter.getView(i, null, listView); +// childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY), +// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); +// +// childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight()); +// childView.setDrawingCacheEnabled(true); +// childView.buildDrawingCache(); +// bmps.add(childView.getDrawingCache()); +// allitemsheight+=childView.getMeasuredHeight(); +// } +// +// Bitmap bigbitmap = Bitmap.createBitmap(listView.getMeasuredWidth(), allitemsheight, Bitmap.Config.ARGB_8888); +// Canvas bigcanvas = new Canvas(bigbitmap); +// +// Paint paint = new Paint(); +// int iHeight = 0; +// +// for (int i = 0; i < bmps.size(); i++) { +// Bitmap bmp = bmps.get(i); +// bigcanvas.drawBitmap(bmp, 0, iHeight, paint); +// iHeight+=bmp.getHeight(); +// +// bmp.recycle(); +// bmp=null; +// } +// +// +// return bigbitmap; +// } +// +// +// private void applyBlur() { +// listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { +// @Override +// public boolean onPreDraw() { +// listView.getViewTreeObserver().removeOnPreDrawListener(this); +// listView.buildDrawingCache(); +// +// Bitmap bmp = listView.getDrawingCache(); +// context.blurFooterBar(bmp); +// return true; +// } +// }); +// } + private void initData() { param = new SearchParam(); pno = 1; diff --git a/app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java new file mode 100755 index 0000000..dd46c13 --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java @@ -0,0 +1,136 @@ +package com.yuzhi.fine.fragment; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioGroup; +import android.widget.TextView; + +import com.yuzhi.fine.R; +import com.yuzhi.fine.activity.MainActivity; +import com.yuzhi.fine.ui.blur.FastBlur; + +/** + * Created by paveldudka on 3/4/14. + */ +public class FastBlurFragment extends Fragment { + private final String DOWNSCALE_FILTER = "downscale_filter"; + + MainActivity activity; + View view; + RadioGroup group; + + private ImageView image; + private TextView text; + private CheckBox downScale; + private TextView statusText; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + view = inflater.inflate(R.layout.fragment_layout, container, false); + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + activity = (MainActivity) getActivity(); + group = (RadioGroup) activity.findViewById(R.id.group); + + image = (ImageView) view.findViewById(R.id.picture); + text = (TextView) view.findViewById(R.id.text); + image.setImageResource(R.drawable.newer02); + statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls)); + addCheckBoxes((ViewGroup) view.findViewById(R.id.controls)); + + if (savedInstanceState != null) { + downScale.setChecked(savedInstanceState.getBoolean(DOWNSCALE_FILTER)); + } + applyBlur(); + } + + private void applyBlur() { + image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + image.getViewTreeObserver().removeOnPreDrawListener(this); + image.buildDrawingCache(); + + Bitmap bmp = image.getDrawingCache(); + blur(bmp, group); + return true; + } + }); + } + + private void blur(Bitmap bkg, View view) { + long startMs = System.currentTimeMillis(); + float scaleFactor = 1; + float radius = 20; + if (downScale.isChecked()) { + scaleFactor = 8; + radius = 2; + } + + Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()/scaleFactor), + (int) (view.getMeasuredHeight()/scaleFactor), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(overlay); + canvas.translate(-view.getLeft()/scaleFactor, -view.getTop()/scaleFactor); + canvas.scale(1 / scaleFactor, 1 / scaleFactor); + Paint paint = new Paint(); + paint.setFlags(Paint.FILTER_BITMAP_FLAG); + canvas.drawBitmap(bkg, 0, 0, paint); + + overlay = FastBlur.doBlur(overlay, (int) radius, true); + view.setBackground(new BitmapDrawable(getResources(), overlay)); + statusText.setText(System.currentTimeMillis() - startMs + "ms"); + } + + @Override + public String toString() { + return "Fast blur"; + } + + private void addCheckBoxes(ViewGroup container) { + + downScale = new CheckBox(getActivity()); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); + downScale.setLayoutParams(lp); + downScale.setText("Downscale before blur"); + downScale.setVisibility(View.VISIBLE); + downScale.setTextColor(0xFFFFFFFF); + downScale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + applyBlur(); + } + }); + container.addView(downScale); + } + + private TextView addStatusText(ViewGroup container) { + TextView result = new TextView(getActivity()); + result.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + result.setTextColor(0xFFFFFFFF); + container.addView(result); + return result; + } + + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putBoolean(DOWNSCALE_FILTER, downScale.isChecked()); + super.onSaveInstanceState(outState); + } +} diff --git a/app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java new file mode 100755 index 0000000..25a1069 --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java @@ -0,0 +1,137 @@ +package com.yuzhi.fine.fragment; + +import android.annotation.TargetApi; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; +import android.os.Build; +import android.os.Bundle; +import android.renderscript.Allocation; +import android.renderscript.RenderScript; +import android.renderscript.ScriptIntrinsicBlur; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import com.yuzhi.fine.R; + + +/** + * Created by paveldudka on 3/4/14. + */ +public class RSBlurFragment extends Fragment { + private ImageView image; + private TextView text; + private TextView statusText; + private CheckBox downScale; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_layout, container, false); + image = (ImageView) view.findViewById(R.id.picture); + text = (TextView) view.findViewById(R.id.text); + image.setImageResource(R.drawable.newer02); + statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls)); + addCheckBoxes((ViewGroup) view.findViewById(R.id.controls)); + applyBlur(); + return view; + } + + private void applyBlur() { + image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + image.getViewTreeObserver().removeOnPreDrawListener(this); + image.buildDrawingCache(); + + Bitmap bmp = image.getDrawingCache(); + blur(bmp, text); + return true; + } + }); + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + private void blur(Bitmap bkg, View view) { + long startMs = System.currentTimeMillis(); + + + float scaleFactor = 1; + float radius = 20; + + if (downScale.isChecked()) { + scaleFactor = 8; + radius = 2; + } + + Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth() / scaleFactor), + (int) (view.getMeasuredHeight() / scaleFactor), Bitmap.Config.ARGB_8888); + + Canvas canvas = new Canvas(overlay); + + canvas.translate(-view.getLeft() / scaleFactor, -view.getTop() / scaleFactor); + canvas.scale(1 / scaleFactor, 1 / scaleFactor); + Paint paint = new Paint(); + paint.setFlags(Paint.FILTER_BITMAP_FLAG); + canvas.drawBitmap(bkg, 0, 0, paint); + + RenderScript rs = RenderScript.create(getActivity()); + + Allocation overlayAlloc = Allocation.createFromBitmap( + rs, overlay); + + ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create( + rs, overlayAlloc.getElement()); + + blur.setInput(overlayAlloc); + + blur.setRadius(radius); + + blur.forEach(overlayAlloc); + + overlayAlloc.copyTo(overlay); + + view.setBackground(new BitmapDrawable( + getResources(), overlay)); + + rs.destroy(); + statusText.setText(System.currentTimeMillis() - startMs + "ms"); + } + + @Override + public String toString() { + return "RenderScript"; + } + + private TextView addStatusText(ViewGroup container) { + TextView result = new TextView(getActivity()); + result.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + result.setTextColor(0xFFFFFFFF); + container.addView(result); + return result; + } + + private void addCheckBoxes(ViewGroup container) { + downScale = new CheckBox(getActivity()); + ViewGroup.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); + downScale.setLayoutParams(lp); + downScale.setText("Downscale before blur"); + downScale.setVisibility(View.VISIBLE); + downScale.setTextColor(0xFFFFFFFF); + downScale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + applyBlur(); + } + }); + container.addView(downScale); + } +} diff --git a/app/src/main/java/com/yuzhi/fine/ui/blur/FastBlur.java b/app/src/main/java/com/yuzhi/fine/ui/blur/FastBlur.java new file mode 100755 index 0000000..e87af1f --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/ui/blur/FastBlur.java @@ -0,0 +1,244 @@ +package com.yuzhi.fine.ui.blur; + +import android.graphics.Bitmap; + +/** + * Created by paveld on 3/6/14. + */ +public class FastBlur { + + public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { + + // Stack Blur v1.0 from + // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html + // + // Java Author: Mario Klingemann + // http://incubator.quasimondo.com + // created Feburary 29, 2004 + // Android port : Yahel Bouaziz + // http://www.kayenko.com + // ported april 5th, 2012 + + // This is a compromise between Gaussian Blur and Box blur + // It creates much better looking blurs than Box Blur, but is + // 7x faster than my Gaussian Blur implementation. + // + // I called it Stack Blur because this describes best how this + // filter works internally: it creates a kind of moving stack + // of colors whilst scanning through the image. Thereby it + // just has to add one new block of color to the right side + // of the stack and remove the leftmost color. The remaining + // colors on the topmost layer of the stack are either added on + // or reduced by one, depending on if they are on the right or + // on the left side of the stack. + // + // If you are using this algorithm in your code please add + // the following line: + // + // Stack Blur Algorithm by Mario Klingemann + + Bitmap bitmap; + if (canReuseInBitmap) { + bitmap = sentBitmap; + } else { + bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); + } + + if (radius < 1) { + return (null); + } + + int w = bitmap.getWidth(); + int h = bitmap.getHeight(); + + int[] pix = new int[w * h]; + bitmap.getPixels(pix, 0, w, 0, 0, w, h); + + int wm = w - 1; + int hm = h - 1; + int wh = w * h; + int div = radius + radius + 1; + + int r[] = new int[wh]; + int g[] = new int[wh]; + int b[] = new int[wh]; + int rsum, gsum, bsum, x, y, i, p, yp, yi, yw; + int vmin[] = new int[Math.max(w, h)]; + + int divsum = (div + 1) >> 1; + divsum *= divsum; + int dv[] = new int[256 * divsum]; + for (i = 0; i < 256 * divsum; i++) { + dv[i] = (i / divsum); + } + + yw = yi = 0; + + int[][] stack = new int[div][3]; + int stackpointer; + int stackstart; + int[] sir; + int rbs; + int r1 = radius + 1; + int routsum, goutsum, boutsum; + int rinsum, ginsum, binsum; + + for (y = 0; y < h; y++) { + rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; + for (i = -radius; i <= radius; i++) { + p = pix[yi + Math.min(wm, Math.max(i, 0))]; + sir = stack[i + radius]; + sir[0] = (p & 0xff0000) >> 16; + sir[1] = (p & 0x00ff00) >> 8; + sir[2] = (p & 0x0000ff); + rbs = r1 - Math.abs(i); + rsum += sir[0] * rbs; + gsum += sir[1] * rbs; + bsum += sir[2] * rbs; + if (i > 0) { + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + } else { + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + } + } + stackpointer = radius; + + for (x = 0; x < w; x++) { + + r[yi] = dv[rsum]; + g[yi] = dv[gsum]; + b[yi] = dv[bsum]; + + rsum -= routsum; + gsum -= goutsum; + bsum -= boutsum; + + stackstart = stackpointer - radius + div; + sir = stack[stackstart % div]; + + routsum -= sir[0]; + goutsum -= sir[1]; + boutsum -= sir[2]; + + if (y == 0) { + vmin[x] = Math.min(x + radius + 1, wm); + } + p = pix[yw + vmin[x]]; + + sir[0] = (p & 0xff0000) >> 16; + sir[1] = (p & 0x00ff00) >> 8; + sir[2] = (p & 0x0000ff); + + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + + rsum += rinsum; + gsum += ginsum; + bsum += binsum; + + stackpointer = (stackpointer + 1) % div; + sir = stack[(stackpointer) % div]; + + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + + rinsum -= sir[0]; + ginsum -= sir[1]; + binsum -= sir[2]; + + yi++; + } + yw += w; + } + for (x = 0; x < w; x++) { + rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; + yp = -radius * w; + for (i = -radius; i <= radius; i++) { + yi = Math.max(0, yp) + x; + + sir = stack[i + radius]; + + sir[0] = r[yi]; + sir[1] = g[yi]; + sir[2] = b[yi]; + + rbs = r1 - Math.abs(i); + + rsum += r[yi] * rbs; + gsum += g[yi] * rbs; + bsum += b[yi] * rbs; + + if (i > 0) { + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + } else { + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + } + + if (i < hm) { + yp += w; + } + } + yi = x; + stackpointer = radius; + for (y = 0; y < h; y++) { + // Preserve alpha channel: ( 0xff000000 & pix[yi] ) + pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum]; + + rsum -= routsum; + gsum -= goutsum; + bsum -= boutsum; + + stackstart = stackpointer - radius + div; + sir = stack[stackstart % div]; + + routsum -= sir[0]; + goutsum -= sir[1]; + boutsum -= sir[2]; + + if (x == 0) { + vmin[y] = Math.min(y + r1, hm) * w; + } + p = x + vmin[y]; + + sir[0] = r[p]; + sir[1] = g[p]; + sir[2] = b[p]; + + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + + rsum += rinsum; + gsum += ginsum; + bsum += binsum; + + stackpointer = (stackpointer + 1) % div; + sir = stack[stackpointer]; + + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + + rinsum -= sir[0]; + ginsum -= sir[1]; + binsum -= sir[2]; + + yi += w; + } + } + + bitmap.setPixels(pix, 0, w, 0, 0, w, h); + + return (bitmap); + } +} diff --git a/app/src/main/java/com/yuzhi/fine/ui/blur/ZoomOutPageTransformer.java b/app/src/main/java/com/yuzhi/fine/ui/blur/ZoomOutPageTransformer.java new file mode 100755 index 0000000..5b7db20 --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/ui/blur/ZoomOutPageTransformer.java @@ -0,0 +1,46 @@ +package com.yuzhi.fine.ui.blur; + +import android.support.v4.view.ViewPager; +import android.view.View; + +/** + * Created by paveld on 3/7/14. + */ +public class ZoomOutPageTransformer implements ViewPager.PageTransformer { + private static final float MIN_SCALE = 0.85f; + private static final float MIN_ALPHA = 0.5f; + + public void transformPage(View view, float position) { + int pageWidth = view.getWidth(); + int pageHeight = view.getHeight(); + + if (position < -1) { // [-Infinity,-1) + // This page is way off-screen to the left. + view.setAlpha(0); + + } else if (position <= 1) { // [-1,1] + // Modify the default slide transition to shrink the page as well + float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); + float vertMargin = pageHeight * (1 - scaleFactor) / 2; + float horzMargin = pageWidth * (1 - scaleFactor) / 2; + if (position < 0) { + view.setTranslationX(horzMargin - vertMargin / 2); + } else { + view.setTranslationX(-horzMargin + vertMargin / 2); + } + + // Scale the page down (between MIN_SCALE and 1) + view.setScaleX(scaleFactor); + view.setScaleY(scaleFactor); + + // Fade the page relative to its size. + view.setAlpha(MIN_ALPHA + + (scaleFactor - MIN_SCALE) / + (1 - MIN_SCALE) * (1 - MIN_ALPHA)); + + } else { // (1,+Infinity] + // This page is way off-screen to the right. + view.setAlpha(0); + } + } +} diff --git a/app/src/main/res/layout/activity_house_detail.xml b/app/src/main/res/layout/activity_house_detail.xml index 98a3d54..8e041b2 100644 --- a/app/src/main/res/layout/activity_house_detail.xml +++ b/app/src/main/res/layout/activity_house_detail.xml @@ -6,7 +6,7 @@ android:fitsSystemWindows="true" android:orientation="vertical"> - + - + + android:layout_weight="1.0" + android:background="@color/background_color" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_touch_gallery.xml b/app/src/main/res/layout/activity_touch_gallery.xml index 0f22320..d715ba3 100644 --- a/app/src/main/res/layout/activity_touch_gallery.xml +++ b/app/src/main/res/layout/activity_touch_gallery.xml @@ -7,7 +7,7 @@ + layout="@layout/layout_main_header" /> + + + + + + + + diff --git a/app/src/main/res/layout/layout_main_footer.xml b/app/src/main/res/layout/layout_main_footer.xml new file mode 100644 index 0000000..79f7582 --- /dev/null +++ b/app/src/main/res/layout/layout_main_footer.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_header.xml b/app/src/main/res/layout/layout_main_header.xml similarity index 100% rename from app/src/main/res/layout/main_header.xml rename to app/src/main/res/layout/layout_main_header.xml diff --git a/app/src/main/res/layout/main_footer.xml b/app/src/main/res/layout/main_footer.xml deleted file mode 100644 index bdf7fc1..0000000 --- a/app/src/main/res/layout/main_footer.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file From cb5224946ea04e7cc9db1986c96074e75363f069 Mon Sep 17 00:00:00 2001 From: tiansj Date: Wed, 13 Jan 2016 11:49:48 +0800 Subject: [PATCH 09/27] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=89=93=E5=8C=85?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=20&=20gradle=E6=B8=A0=E9=81=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 43 +++++++++++++++++++++++++++++++++++++++++++ build.gradle | 2 +- deploy.sh | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100755 deploy.sh diff --git a/app/build.gradle b/app/build.gradle index 4e5fe41..68b654e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,9 +1,28 @@ apply plugin: 'com.android.application' +apply plugin: 'packer' + + +packer { + /**渠道包**/ + manifestMatcher = ['UMENG_CHANNEL','Promotion_Market'] + archiveOutput = file(new File(project.rootProject.buildDir.path, "apks")) + archiveNameFormat = '${appPkg}-c-${buildType}-${buildTime}' + + /**版本号自增**/ + // 指定是否使用build版本号自增 + buildNumberAuto = true + // 指定使用版本号自增的buildType,默认是全部 + buildNumberTypeMatcher = ['release', 'debug'] +} android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { + // Warning:Renderscript support mode is not currently supported with renderscript target 21+ + renderscriptTargetApi 20 + renderscriptSupportModeEnabled true + applicationId "com.yuzhi.fine" minSdkVersion 14 targetSdkVersion 22 @@ -17,6 +36,12 @@ android { storeFile file('keystore/release.jks') storePassword '11118888' } + debug { + keyAlias 'debug' + keyPassword '11118888' + storeFile file('keystore/debug.jks') + storePassword '11118888' + } } buildTypes { release { @@ -25,6 +50,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } + debug { + minifyEnabled false + debuggable true + signingConfig signingConfigs.debug + } } sourceSets { main() { @@ -41,10 +71,23 @@ android { lintOptions { abortOnError false } + tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' + } + + packagingOptions { + exclude 'lib/armeabi-v7a/librsjni.so' + exclude 'lib/armeabi-v7a/libRSSupport.so' + exclude 'lib/mips/librsjni.so' + exclude 'lib/mips/libRSSupport.so' + exclude 'lib/x86/librsjni.so' + exclude 'lib/x86/libRSSupport.so' + } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'jp.wasabeef:blurry:1.0.5' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.picasso:picasso:2.5.2' diff --git a/build.gradle b/build.gradle index 1b7886d..a48bf3d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' - + classpath 'com.mcxiaoke.gradle:packer:1.0.+' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..e6f0738 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,37 @@ +#!/bin/bash --login + +apkPath=./app/build/outputs/apk +apkDebugFile=${apkPath}/app-debug.apk +apkReleaseFile=${apkPath}/app-release.apk +propertiesFile=./app/packer.properties + +function pkgDebug(){ + echo "package debug internal start" + ./gradlew clean assembleDebug + . ${propertiesFile}; + apkNew="debug-${version}.apk"; + mv ${apkDebugFile} ${apkNew}; + cp ${apkNew} /Users/tiansj/ + # scp ${apkNew} root@192.168.1.28:/var/download/mobile/phone/android + echo "package debug internal success" + rm -rf ./${apkNew} +} + +function pkgRelease(){ + echo "package release outer start" + ./gradlew clean assembleRelease + . ${propertiesFile}; + apkNew="release-${version}.apk"; + mv ${apkReleaseFile} ${apkNew}; + cp ${apkNew} /Users/tiansj/ + # scp ${apkNew} root@192.168.1.28:/var/download/mobile/phone/android + echo "package release outer success" + rm -rf ./${apkNew} +} +echo "Build start.........." + pkgDebug; + pkgRelease; +echo "Build end" + + + From 10d6d57c13d40c12e9f96e92f865ab4a3aff48e6 Mon Sep 17 00:00:00 2001 From: tiansj Date: Wed, 13 Jan 2016 11:50:21 +0800 Subject: [PATCH 10/27] add packer.properties --- app/packer.properties | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/packer.properties diff --git a/app/packer.properties b/app/packer.properties new file mode 100644 index 0000000..ec0ff60 --- /dev/null +++ b/app/packer.properties @@ -0,0 +1,2 @@ +#Wed Jan 13 11:46:08 CST 2016 +version=23 From d0d066c945d186fadd15bf48af6be1744bb64006 Mon Sep 17 00:00:00 2001 From: tiansj Date: Wed, 13 Jan 2016 11:50:45 +0800 Subject: [PATCH 11/27] add debug.jks --- app/keystore/debug.jks | Bin 0 -> 1354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/keystore/debug.jks diff --git a/app/keystore/debug.jks b/app/keystore/debug.jks new file mode 100644 index 0000000000000000000000000000000000000000..325b80c812ee0893167ebee53d845676077cfa2a GIT binary patch literal 1354 zcmezO_TO6u1_mY|W&~r_l+>isbRaLt;>oQTpv-QACZ_EMd~96WY>X_7T1<2$lKE!t|tFSdd7);)#3_0Og{c{K|5v%P7+GjL%AQ7FFb1*4|km zqR1Yx(#!DHO_?r(AF-!Dub(XWb>4=n%S$&^XiClQkPcNBoY|H2j%`|t$wLE^H+C2M zI@jXoW-@~zi0vUHeid-}U6+kwQVT{ZvxJzg2T*%uLT zO;q9FZI$PGI~H2~bDAmD(OjU-=ydwBJWHaN(l+^7!Jm))aN(N2tYwO|O^{X3h9p-T z4%@Ky7t(4`p>a-O6Zzf4glhd4uhx#Z=cBT@O5(xgoBPZ6m9nmB*IVg^TLy+L)@4FSdId*GFR{eU;9_D&nP|P8IlV0ElHBF66 zG427pL18_+E*Ck+?|pTK`^0s}{(mv@k1uRpuC#c*$|D1l>6c4xH#f}Ll5$M=$v=UB zyE^Os#Qf85;s4WgHqzu+ZUO5z<@L48yI9(P8Z^9!sJhZE<@M~Q$Rk7d36rz4AE$QZ zcL#gyb&&d{X3hJ0kKvB4m!Uqzd0f@*O>Qb&x{vPswcPpnQs!Ng?^61D%+5~x5`$q0c$=8vJa_Tl31B-g*&WVLi{+ukYV z`(8i)et3JZ{&72H##`NaF{Upk?E9=W!D8LND|+$EPQ+gS3Q5rsdZq@Jz?AF>Ov$bW zO^oXnFf%bSF|mYA-95*EmyJ`a&7yc`P?wRh=CADo>`c?Br`FuI3qDXD>KzV zPMp`!%)rpl*ucot(7+-}oY%zAz|g=9%B7z}8s{U20WfbfH}*0ZGQ$kr7b~BsPzT4xteT)jzsvmU*r&2ja(l76JSU2=ajnpWQ_?<%CVoyidfk+j zvAA~4FN3SGrA!?~hqzq-zSzH6AbIfvWhQ1u21aD(0i%c+=&qp4f*Es_qJO;No@J4@ z@66}Gx`*9j9tnwtO}o>c-O0+lwPixV<$vL8FWJpqvAkJ3a);t6@frMF6^ndle>fZe z@^b6THSbS7{GxyG-N)i}7MsF$q?NB*_2FZZ&P;9dSsG8$Ewy`R9Y49gE&1Bt$0i1* rcCNNY5ORIfraw_W^6lo;Su5AKoleg)x8Js^V6q6yn&}|`XU8Gk literal 0 HcmV?d00001 From ce66d19f29e5275fc6259185b91188a45614ca15 Mon Sep 17 00:00:00 2001 From: tiansj Date: Mon, 1 Feb 2016 18:48:39 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E5=BA=95=E9=83=A8=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=AA=E8=AF=BB=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.iml | 1 - app/packer.properties | 4 +- .../fine/activity/BaseFragmentActivity.java | 6 +- .../drawable-xhdpi/ic_bg_unread_count.9.png | Bin 0 -> 539 bytes .../main/res/layout/layout_main_footer.xml | 65 ++++++++++++++++-- 5 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_bg_unread_count.9.png diff --git a/app/app.iml b/app/app.iml index 211dc43..e8ac758 100644 --- a/app/app.iml +++ b/app/app.iml @@ -64,7 +64,6 @@ - diff --git a/app/packer.properties b/app/packer.properties index ec0ff60..a8f5e6d 100644 --- a/app/packer.properties +++ b/app/packer.properties @@ -1,2 +1,2 @@ -#Wed Jan 13 11:46:08 CST 2016 -version=23 +#Mon Feb 01 18:38:40 CST 2016 +version=57 diff --git a/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java b/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java index 0aaef51..9f653df 100644 --- a/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java +++ b/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java @@ -44,8 +44,8 @@ protected void setTranslucentStatus() { WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Translucent navigation bar - window.setFlags( - WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, - WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); +// window.setFlags( +// WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, +// WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } diff --git a/app/src/main/res/drawable-xhdpi/ic_bg_unread_count.9.png b/app/src/main/res/drawable-xhdpi/ic_bg_unread_count.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6a74fad91f2c6c0ee2b1272e334e5b1a4d7d8c GIT binary patch literal 539 zcmV+$0_6RPP)i#RsP(8fNQh3CK*(6e~q5ge#`G9C0J7wT>)6llR(`mxc> zWQIxG&2Peglg)0UQBDgQl-h`~BV~yjUvgL3;$BJq0>3A|6hYki1jq4t_@3kreplH7 zs1Cb=iTl3Izt+JrcKps3cW4L9HA{h2HaDO@;;%z3FuN5VvO_t3RcPMW6+XUCFqKdJ)A!i zY^c$y{`wt~NYQW-7GCVu3K|12nge5M4u&-)XA6T7app}E^wRMp{6eM@`JZ`lLWV8wqwF|yU zUTbVV*nVMz3mT~lV~1VnaTT{%@5j7>XBdYRk{rnKx6()2CFbf%dA^zE>HkP3r=;lz zMem~<+f%^>5I9k=fRVcZf-wjdKrGR&tXvhAmcnR_yBKeRbG&ZeIAH7($LH~K4W*^% dqau6e_6@i|rjhW#FKYk*002ovPDHLkV1gnZ_niO$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/layout_main_footer.xml b/app/src/main/res/layout/layout_main_footer.xml index 79f7582..cff2045 100644 --- a/app/src/main/res/layout/layout_main_footer.xml +++ b/app/src/main/res/layout/layout_main_footer.xml @@ -1,12 +1,17 @@ - + android:background="@color/main_footer_bg"> + + - - \ No newline at end of file + + + + + + + + + + + + + + + + + \ No newline at end of file From dc220ce260a1ec355d937f041b142e46e24ca714 Mon Sep 17 00:00:00 2001 From: tiansj Date: Mon, 1 Feb 2016 18:49:11 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E8=A7=A3=E5=86=B3fragment=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yuzhi/fine/activity/MainActivity.java | 132 +++++++++++++----- 1 file changed, 96 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java b/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java index cab4205..6a14db5 100644 --- a/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java +++ b/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java @@ -6,89 +6,149 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import android.util.Log; import android.view.KeyEvent; import android.widget.RadioGroup; import com.yuzhi.fine.R; import com.yuzhi.fine.fragment.BufferKnifeFragment; +import com.yuzhi.fine.fragment.HomeFragment; import com.yuzhi.fine.fragment.MainPagerFragment; import com.yuzhi.fine.fragment.MemberFragment; import com.yuzhi.fine.ui.UIHelper; +import java.util.ArrayList; import java.util.Arrays; -import java.util.List; public class MainActivity extends BaseFragmentActivity { - private static int currSel = 0; + private static final String TAG = MainActivity.class.getSimpleName(); + private static final String CURR_INDEX_KEY = "currIndexKey"; + private static final String FRAGMENT_TAG_LIST = "fragmentTagList"; + private static int currIndex = 0; private RadioGroup group; - private Fragment homeFragment = new MainPagerFragment(); - private Fragment imFragment = new BufferKnifeFragment(); - private Fragment interestFragment = new BufferKnifeFragment(); - private Fragment memberFragment = new MemberFragment(); - private List fragmentList = Arrays.asList(homeFragment, imFragment, interestFragment, memberFragment); - + private MainPagerFragment homeFragment; + private BufferKnifeFragment imFragment; + private BufferKnifeFragment interestFragment; + private MemberFragment memberFragment; + private ArrayList fragmentList; + private ArrayList fragmentTagList; private FragmentManager fragmentManager; @Override - protected void onCreate(Bundle bundle) { - super.onCreate(bundle); + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getSupportFragmentManager(); - initFootBar(); - } - - @Override - protected void onResume() { - super.onResume(); + if (savedInstanceState == null) { + initData(); + initView(); + } else { + initFromSavedInstantsState(savedInstanceState); + } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - Fragment fragment = fragmentList.get(currSel); + Fragment fragment = fragmentList.get(currIndex); if (fragment != null) { fragment.onActivityResult(requestCode, resultCode, data); } } - private void initFootBar() { + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(CURR_INDEX_KEY, currIndex); + outState.putStringArrayList(FRAGMENT_TAG_LIST, fragmentTagList); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + initFromSavedInstantsState(savedInstanceState); + } + + private void initData() { + fragmentTagList = new ArrayList<>(Arrays.asList("HomeFragment", "ImFragment", "InterestFragment", "MemberFragment")); + fragmentList = new ArrayList<>(Arrays.asList(homeFragment, imFragment, interestFragment, memberFragment)); + } + + private void initFromSavedInstantsState(Bundle savedInstanceState) { + currIndex = savedInstanceState.getInt(CURR_INDEX_KEY); + fragmentTagList = savedInstanceState.getStringArrayList(FRAGMENT_TAG_LIST); + for(int i = 0; i < fragmentTagList.size(); i++) { + Fragment fragment = fragmentManager.findFragmentByTag(fragmentTagList.get(i)); + if(fragment != null) { + fragmentList.set(i, fragment); + } + } + addFragmentToStack(); + } + + private void initView() { group = (RadioGroup) findViewById(R.id.group); group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { - case R.id.foot_bar_home: currSel = 0; break; - case R.id.foot_bar_im: currSel = 1; break; - case R.id.foot_bar_interest: currSel = 2; break; - case R.id.main_footbar_user: currSel = 3; break; - } - addFragmentToStack(currSel); - if(currSel == 3) { - UIHelper.showLogin(MainActivity.this); + case R.id.foot_bar_home: + currIndex = 0; + break; + case R.id.foot_bar_im: + currIndex = 1; + break; + case R.id.foot_bar_interest: + currIndex = 2; + break; + case R.id.main_footbar_user: + currIndex = 3; + break; } + addFragmentToStack(); } }); - addFragmentToStack(0); + addFragmentToStack(); } - private void addFragmentToStack(int cur) { + private void addFragmentToStack() { + if (currIndex == 3) { + UIHelper.showLogin(MainActivity.this); + } + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - Fragment fragment = fragmentList.get(cur); - if (!fragment.isAdded()) { - fragmentTransaction.add(R.id.fragment_container, fragment); + Fragment fragment = fragmentList.get(currIndex); + if(fragment == null) { + fragment = instantFragment(currIndex); + fragmentList.set(currIndex, fragment); } - for (int i = 0; i < fragmentList.size(); i++) { - Fragment f = fragmentList.get(i); - if (i == cur && f.isAdded()) { - fragmentTransaction.show(f); - } else if (f != null && f.isAdded() && f.isVisible()) { + for (int i = 0; i < fragmentTagList.size(); i++) { + Fragment f = fragmentManager.findFragmentByTag(fragmentTagList.get(i)); + if(f != null && f.isAdded()) { fragmentTransaction.hide(f); } } + if (!fragment.isAdded()) { + fragmentTransaction.add(R.id.fragment_container, fragment, fragmentTagList.get(currIndex)); + } else { + fragmentTransaction.show(fragment); + } fragmentTransaction.commitAllowingStateLoss(); + fragmentManager.executePendingTransactions(); + } + + // 使用时加载 + private Fragment instantFragment(int currIndex) { + switch (currIndex) { + case 0: return homeFragment = new MainPagerFragment(); + case 1: return imFragment = new BufferKnifeFragment(); + case 2: return interestFragment = new BufferKnifeFragment(); + case 3: return memberFragment = new MemberFragment(); + default: return null; + } } @Override From 10e8e65e16341360d19e66041f43809a2b0584ae Mon Sep 17 00:00:00 2001 From: tiansj Date: Mon, 1 Feb 2016 22:13:49 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E8=A7=A3=E5=86=B3fragment=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E9=97=AE=E9=A2=98=EF=BC=8C=E8=BF=9B=E4=B8=80=E6=AD=A5?= =?UTF-8?q?=E4=BC=98=E5=8C=96MainActivity=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/packer.properties | 4 +- .../com/yuzhi/fine/activity/MainActivity.java | 92 ++++++------------- 2 files changed, 32 insertions(+), 64 deletions(-) diff --git a/app/packer.properties b/app/packer.properties index a8f5e6d..f1ba7a8 100644 --- a/app/packer.properties +++ b/app/packer.properties @@ -1,2 +1,2 @@ -#Mon Feb 01 18:38:40 CST 2016 -version=57 +#Mon Feb 01 22:01:08 CST 2016 +version=63 diff --git a/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java b/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java index 6a14db5..6408e0c 100644 --- a/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java +++ b/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java @@ -1,18 +1,15 @@ package com.yuzhi.fine.activity; -import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; -import android.util.Log; import android.view.KeyEvent; import android.widget.RadioGroup; import com.yuzhi.fine.R; import com.yuzhi.fine.fragment.BufferKnifeFragment; -import com.yuzhi.fine.fragment.HomeFragment; import com.yuzhi.fine.fragment.MainPagerFragment; import com.yuzhi.fine.fragment.MemberFragment; import com.yuzhi.fine.ui.UIHelper; @@ -23,18 +20,13 @@ public class MainActivity extends BaseFragmentActivity { private static final String TAG = MainActivity.class.getSimpleName(); - private static final String CURR_INDEX_KEY = "currIndexKey"; - private static final String FRAGMENT_TAG_LIST = "fragmentTagList"; + private static final String FRAGMENT_TAGS = "fragmentTags"; + private static final String CURR_INDEX = "currIndex"; private static int currIndex = 0; private RadioGroup group; - private MainPagerFragment homeFragment; - private BufferKnifeFragment imFragment; - private BufferKnifeFragment interestFragment; - private MemberFragment memberFragment; - private ArrayList fragmentList; - private ArrayList fragmentTagList; + private ArrayList fragmentTags; private FragmentManager fragmentManager; @Override @@ -50,20 +42,11 @@ protected void onCreate(Bundle savedInstanceState) { } } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - Fragment fragment = fragmentList.get(currIndex); - if (fragment != null) { - fragment.onActivityResult(requestCode, resultCode, data); - } - } - @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putInt(CURR_INDEX_KEY, currIndex); - outState.putStringArrayList(FRAGMENT_TAG_LIST, fragmentTagList); + outState.putInt(CURR_INDEX, currIndex); + outState.putStringArrayList(FRAGMENT_TAGS, fragmentTags); } @Override @@ -72,21 +55,15 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) { initFromSavedInstantsState(savedInstanceState); } - private void initData() { - fragmentTagList = new ArrayList<>(Arrays.asList("HomeFragment", "ImFragment", "InterestFragment", "MemberFragment")); - fragmentList = new ArrayList<>(Arrays.asList(homeFragment, imFragment, interestFragment, memberFragment)); + private void initFromSavedInstantsState(Bundle savedInstanceState) { + currIndex = savedInstanceState.getInt(CURR_INDEX); + fragmentTags = savedInstanceState.getStringArrayList(FRAGMENT_TAGS); + showFragment(); } - private void initFromSavedInstantsState(Bundle savedInstanceState) { - currIndex = savedInstanceState.getInt(CURR_INDEX_KEY); - fragmentTagList = savedInstanceState.getStringArrayList(FRAGMENT_TAG_LIST); - for(int i = 0; i < fragmentTagList.size(); i++) { - Fragment fragment = fragmentManager.findFragmentByTag(fragmentTagList.get(i)); - if(fragment != null) { - fragmentList.set(i, fragment); - } - } - addFragmentToStack(); + private void initData() { + currIndex = 0; + fragmentTags = new ArrayList<>(Arrays.asList("HomeFragment", "ImFragment", "InterestFragment", "MemberFragment")); } private void initView() { @@ -95,58 +72,49 @@ private void initView() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { - case R.id.foot_bar_home: - currIndex = 0; - break; - case R.id.foot_bar_im: - currIndex = 1; - break; - case R.id.foot_bar_interest: - currIndex = 2; - break; - case R.id.main_footbar_user: - currIndex = 3; - break; + case R.id.foot_bar_home: currIndex = 0; break; + case R.id.foot_bar_im: currIndex = 1; break; + case R.id.foot_bar_interest: currIndex = 2; break; + case R.id.main_footbar_user: currIndex = 3; break; + default: break; } - addFragmentToStack(); + showFragment(); } }); - addFragmentToStack(); + showFragment(); } - private void addFragmentToStack() { + private void showFragment() { if (currIndex == 3) { UIHelper.showLogin(MainActivity.this); } FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - Fragment fragment = fragmentList.get(currIndex); + Fragment fragment = fragmentManager.findFragmentByTag(fragmentTags.get(currIndex)); if(fragment == null) { fragment = instantFragment(currIndex); - fragmentList.set(currIndex, fragment); } - for (int i = 0; i < fragmentTagList.size(); i++) { - Fragment f = fragmentManager.findFragmentByTag(fragmentTagList.get(i)); + for (int i = 0; i < fragmentTags.size(); i++) { + Fragment f = fragmentManager.findFragmentByTag(fragmentTags.get(i)); if(f != null && f.isAdded()) { fragmentTransaction.hide(f); } } - if (!fragment.isAdded()) { - fragmentTransaction.add(R.id.fragment_container, fragment, fragmentTagList.get(currIndex)); - } else { + if (fragment.isAdded()) { fragmentTransaction.show(fragment); + } else { + fragmentTransaction.add(R.id.fragment_container, fragment, fragmentTags.get(currIndex)); } fragmentTransaction.commitAllowingStateLoss(); fragmentManager.executePendingTransactions(); } - // 使用时加载 private Fragment instantFragment(int currIndex) { switch (currIndex) { - case 0: return homeFragment = new MainPagerFragment(); - case 1: return imFragment = new BufferKnifeFragment(); - case 2: return interestFragment = new BufferKnifeFragment(); - case 3: return memberFragment = new MemberFragment(); + case 0: return new MainPagerFragment(); + case 1: return new BufferKnifeFragment(); + case 2: return new BufferKnifeFragment(); + case 3: return new MemberFragment(); default: return null; } } From a980d0bf13de88b0dc81d0fb8b6961925b6e7277 Mon Sep 17 00:00:00 2001 From: tiansj Date: Tue, 2 Feb 2016 11:52:24 +0800 Subject: [PATCH 15/27] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=EF=BC=8C=E4=BC=98=E5=8C=96MemberFragment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.iml | 7 +- app/build.gradle | 2 - app/packer.properties | 4 +- .../yuzhi/fine/fragment/DemoPtrFragment.java | 94 ------------ .../yuzhi/fine/fragment/FastBlurFragment.java | 136 ----------------- .../yuzhi/fine/fragment/MemberFragment.java | 24 ++- .../yuzhi/fine/fragment/RSBlurFragment.java | 137 ------------------ .../main/res/drawable-xhdpi/ic_calculator.png | Bin 0 -> 1944 bytes .../res/drawable-xhdpi/ic_setting_arrow.png | Bin 0 -> 653 bytes .../drawable-xhdpi/ic_setting_attention.png | Bin 0 -> 1957 bytes .../res/drawable-xhdpi/ic_setting_balance.png | Bin 0 -> 2149 bytes .../res/drawable-xhdpi/ic_setting_helper.png | Bin 0 -> 2265 bytes .../res/drawable-xhdpi/ic_setting_record.png | Bin 0 -> 1431 bytes .../res/drawable-xhdpi/ic_setting_setting.png | Bin 0 -> 2194 bytes .../main/res/layout/activity_house_detail.xml | 32 ++-- .../res/layout/fragment_map_house_item.xml | 4 +- .../main/res/layout/layout_main_footer.xml | 8 +- .../main/res/layout/layout_main_header.xml | 2 +- .../main/res/layout/member_content_view.xml | 122 ++++++++++++++-- app/src/main/res/layout/member_head_view.xml | 38 ++--- app/src/main/res/values/colors.xml | 79 +++++----- app/src/main/res/values/styles.xml | 9 +- 22 files changed, 213 insertions(+), 485 deletions(-) delete mode 100755 app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java delete mode 100755 app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_calculator.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_arrow.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_attention.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_balance.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_helper.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_record.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_setting_setting.png diff --git a/app/app.iml b/app/app.iml index e8ac758..b5697d0 100644 --- a/app/app.iml +++ b/app/app.iml @@ -72,7 +72,6 @@ - @@ -90,12 +89,10 @@ - - - - + + diff --git a/app/build.gradle b/app/build.gradle index 68b654e..71fd533 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -87,11 +87,9 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'jp.wasabeef:blurry:1.0.5' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'com.squareup.picasso:picasso:2.5.2' - compile 'com.github.bumptech.glide:glide:3.6.1' compile 'com.alibaba:fastjson:1.1.34.android' compile 'com.j256.ormlite:ormlite-android:4.48' compile 'com.j256.ormlite:ormlite-core:4.48' diff --git a/app/packer.properties b/app/packer.properties index f1ba7a8..97f7b7a 100644 --- a/app/packer.properties +++ b/app/packer.properties @@ -1,2 +1,2 @@ -#Mon Feb 01 22:01:08 CST 2016 -version=63 +#Tue Feb 02 11:47:36 CST 2016 +version=81 diff --git a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java index b7fba11..837a317 100644 --- a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java +++ b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java @@ -134,105 +134,11 @@ public void onScrollStateChanged(AbsListView view, int scrollState) { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - // getLastVisibleItemBitmap(firstVisibleItem+visibleItemCount); -// takeScreenShot(context); } }); } -// public void takeScreenShot(Activity activity) { -// // View是你需要截图的View -// View view = activity.getWindow().getDecorView(); -// view.setDrawingCacheEnabled(true); -// view.buildDrawingCache(); -// Bitmap b1 = view.getDrawingCache(); -// -// // 获取状态栏高度 -// Rect frame = new Rect(); -// activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); -// int statusBarHeight = frame.top; -// System.out.println(statusBarHeight); -// -// // 获取屏幕长和高 -// int width = activity.getWindowManager().getDefaultDisplay().getWidth(); -// int height = activity.getWindowManager().getDefaultDisplay().getHeight(); -// // 去掉标题栏 -//// Bitmap b = Bitmap.createBitmap(b1, 0, height-120, width, 120); -// Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height -// - statusBarHeight); -// view.destroyDrawingCache(); -// context.blurFooterBar(b); -//// return b; -// } -// -// private void getLastVisibleItemBitmap(int pos) { -// View childView = adapter.getView(pos, null, listView); -// if(childView == null) { -// return; -// } -// childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY), -// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); -// -// childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight()); -// childView.setDrawingCacheEnabled(true); -// childView.buildDrawingCache(); -//// return childView.getDrawingCache(); -// context.blurFooterBar(childView.getDrawingCache()); -// } -// -// public Bitmap getWholeListViewItemsToBitmap() { -// int itemscount = adapter.getCount(); -// int allitemsheight = 0; -// List bmps = new ArrayList(); -// -// for (int i = 0; i < itemscount; i++) { -// -// View childView = adapter.getView(i, null, listView); -// childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY), -// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); -// -// childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight()); -// childView.setDrawingCacheEnabled(true); -// childView.buildDrawingCache(); -// bmps.add(childView.getDrawingCache()); -// allitemsheight+=childView.getMeasuredHeight(); -// } -// -// Bitmap bigbitmap = Bitmap.createBitmap(listView.getMeasuredWidth(), allitemsheight, Bitmap.Config.ARGB_8888); -// Canvas bigcanvas = new Canvas(bigbitmap); -// -// Paint paint = new Paint(); -// int iHeight = 0; -// -// for (int i = 0; i < bmps.size(); i++) { -// Bitmap bmp = bmps.get(i); -// bigcanvas.drawBitmap(bmp, 0, iHeight, paint); -// iHeight+=bmp.getHeight(); -// -// bmp.recycle(); -// bmp=null; -// } -// -// -// return bigbitmap; -// } -// -// -// private void applyBlur() { -// listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { -// @Override -// public boolean onPreDraw() { -// listView.getViewTreeObserver().removeOnPreDrawListener(this); -// listView.buildDrawingCache(); -// -// Bitmap bmp = listView.getDrawingCache(); -// context.blurFooterBar(bmp); -// return true; -// } -// }); -// } - private void initData() { param = new SearchParam(); pno = 1; diff --git a/app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java deleted file mode 100755 index dd46c13..0000000 --- a/app/src/main/java/com/yuzhi/fine/fragment/FastBlurFragment.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.yuzhi.fine.fragment; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RadioGroup; -import android.widget.TextView; - -import com.yuzhi.fine.R; -import com.yuzhi.fine.activity.MainActivity; -import com.yuzhi.fine.ui.blur.FastBlur; - -/** - * Created by paveldudka on 3/4/14. - */ -public class FastBlurFragment extends Fragment { - private final String DOWNSCALE_FILTER = "downscale_filter"; - - MainActivity activity; - View view; - RadioGroup group; - - private ImageView image; - private TextView text; - private CheckBox downScale; - private TextView statusText; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - view = inflater.inflate(R.layout.fragment_layout, container, false); - return view; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - activity = (MainActivity) getActivity(); - group = (RadioGroup) activity.findViewById(R.id.group); - - image = (ImageView) view.findViewById(R.id.picture); - text = (TextView) view.findViewById(R.id.text); - image.setImageResource(R.drawable.newer02); - statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls)); - addCheckBoxes((ViewGroup) view.findViewById(R.id.controls)); - - if (savedInstanceState != null) { - downScale.setChecked(savedInstanceState.getBoolean(DOWNSCALE_FILTER)); - } - applyBlur(); - } - - private void applyBlur() { - image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - image.getViewTreeObserver().removeOnPreDrawListener(this); - image.buildDrawingCache(); - - Bitmap bmp = image.getDrawingCache(); - blur(bmp, group); - return true; - } - }); - } - - private void blur(Bitmap bkg, View view) { - long startMs = System.currentTimeMillis(); - float scaleFactor = 1; - float radius = 20; - if (downScale.isChecked()) { - scaleFactor = 8; - radius = 2; - } - - Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()/scaleFactor), - (int) (view.getMeasuredHeight()/scaleFactor), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(overlay); - canvas.translate(-view.getLeft()/scaleFactor, -view.getTop()/scaleFactor); - canvas.scale(1 / scaleFactor, 1 / scaleFactor); - Paint paint = new Paint(); - paint.setFlags(Paint.FILTER_BITMAP_FLAG); - canvas.drawBitmap(bkg, 0, 0, paint); - - overlay = FastBlur.doBlur(overlay, (int) radius, true); - view.setBackground(new BitmapDrawable(getResources(), overlay)); - statusText.setText(System.currentTimeMillis() - startMs + "ms"); - } - - @Override - public String toString() { - return "Fast blur"; - } - - private void addCheckBoxes(ViewGroup container) { - - downScale = new CheckBox(getActivity()); - FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); - downScale.setLayoutParams(lp); - downScale.setText("Downscale before blur"); - downScale.setVisibility(View.VISIBLE); - downScale.setTextColor(0xFFFFFFFF); - downScale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - applyBlur(); - } - }); - container.addView(downScale); - } - - private TextView addStatusText(ViewGroup container) { - TextView result = new TextView(getActivity()); - result.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - result.setTextColor(0xFFFFFFFF); - container.addView(result); - return result; - } - - @Override - public void onSaveInstanceState(Bundle outState) { - outState.putBoolean(DOWNSCALE_FILTER, downScale.isChecked()); - super.onSaveInstanceState(outState); - } -} diff --git a/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java index 49e5eac..2c4752d 100644 --- a/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java +++ b/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java @@ -3,7 +3,6 @@ import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -55,23 +54,38 @@ public void onClick(View v) { }); - scrollView.getPullRootView().findViewById(R.id.tv_test1).setOnClickListener(new View.OnClickListener() { + scrollView.getPullRootView().findViewById(R.id.textBalance).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); - - scrollView.getPullRootView().findViewById(R.id.tv_test2).setOnClickListener(new View.OnClickListener() { + scrollView.getPullRootView().findViewById(R.id.textRecord).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + scrollView.getPullRootView().findViewById(R.id.textAttention).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + scrollView.getPullRootView().findViewById(R.id.textHelp).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + scrollView.getPullRootView().findViewById(R.id.textCalculator).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); - scrollView.getPullRootView().findViewById(R.id.tv_test3).setOnClickListener(new View.OnClickListener() { + scrollView.getPullRootView().findViewById(R.id.textSetting).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); + // DisplayMetrics localDisplayMetrics = new DisplayMetrics(); // context.getWindowManager().getDefaultDisplay().getMetrics(localDisplayMetrics); // int mScreenHeight = localDisplayMetrics.heightPixels; diff --git a/app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java deleted file mode 100755 index 25a1069..0000000 --- a/app/src/main/java/com/yuzhi/fine/fragment/RSBlurFragment.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.yuzhi.fine.fragment; - -import android.annotation.TargetApi; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.drawable.BitmapDrawable; -import android.os.Build; -import android.os.Bundle; -import android.renderscript.Allocation; -import android.renderscript.RenderScript; -import android.renderscript.ScriptIntrinsicBlur; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - -import com.yuzhi.fine.R; - - -/** - * Created by paveldudka on 3/4/14. - */ -public class RSBlurFragment extends Fragment { - private ImageView image; - private TextView text; - private TextView statusText; - private CheckBox downScale; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_layout, container, false); - image = (ImageView) view.findViewById(R.id.picture); - text = (TextView) view.findViewById(R.id.text); - image.setImageResource(R.drawable.newer02); - statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls)); - addCheckBoxes((ViewGroup) view.findViewById(R.id.controls)); - applyBlur(); - return view; - } - - private void applyBlur() { - image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - image.getViewTreeObserver().removeOnPreDrawListener(this); - image.buildDrawingCache(); - - Bitmap bmp = image.getDrawingCache(); - blur(bmp, text); - return true; - } - }); - } - - @TargetApi(Build.VERSION_CODES.KITKAT) - private void blur(Bitmap bkg, View view) { - long startMs = System.currentTimeMillis(); - - - float scaleFactor = 1; - float radius = 20; - - if (downScale.isChecked()) { - scaleFactor = 8; - radius = 2; - } - - Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth() / scaleFactor), - (int) (view.getMeasuredHeight() / scaleFactor), Bitmap.Config.ARGB_8888); - - Canvas canvas = new Canvas(overlay); - - canvas.translate(-view.getLeft() / scaleFactor, -view.getTop() / scaleFactor); - canvas.scale(1 / scaleFactor, 1 / scaleFactor); - Paint paint = new Paint(); - paint.setFlags(Paint.FILTER_BITMAP_FLAG); - canvas.drawBitmap(bkg, 0, 0, paint); - - RenderScript rs = RenderScript.create(getActivity()); - - Allocation overlayAlloc = Allocation.createFromBitmap( - rs, overlay); - - ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create( - rs, overlayAlloc.getElement()); - - blur.setInput(overlayAlloc); - - blur.setRadius(radius); - - blur.forEach(overlayAlloc); - - overlayAlloc.copyTo(overlay); - - view.setBackground(new BitmapDrawable( - getResources(), overlay)); - - rs.destroy(); - statusText.setText(System.currentTimeMillis() - startMs + "ms"); - } - - @Override - public String toString() { - return "RenderScript"; - } - - private TextView addStatusText(ViewGroup container) { - TextView result = new TextView(getActivity()); - result.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - result.setTextColor(0xFFFFFFFF); - container.addView(result); - return result; - } - - private void addCheckBoxes(ViewGroup container) { - downScale = new CheckBox(getActivity()); - ViewGroup.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); - downScale.setLayoutParams(lp); - downScale.setText("Downscale before blur"); - downScale.setVisibility(View.VISIBLE); - downScale.setTextColor(0xFFFFFFFF); - downScale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - applyBlur(); - } - }); - container.addView(downScale); - } -} diff --git a/app/src/main/res/drawable-xhdpi/ic_calculator.png b/app/src/main/res/drawable-xhdpi/ic_calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..8d641e42cb14ff65df6987fd0ea4b6a7a730f5c1 GIT binary patch literal 1944 zcmV;J2WR++P)Px+Qb|NXRA>d&T5D`nMHD`B_tBQ!+EPks3sg#5>4PdEN=hFw0Yi;1@Dco>qQ;;^&zoy_1S48FFqb0+aQ*8wYzk%2@EzQfiL-R*R4K)_qD^Z1AWYY7wh4Zu)QQj>dJOJqE{Zt!gV)|c7W z;d6cuXL_bQ~0FFnzxbIh)+vzNbn~snhO0s@+~ftL@fo=OD8`O zgYoI&UD=ND`Vqz>GFtuSrVPvS{V37nVl zOe(}AnR#_ua?hX_+75K9bfZ;!yv||&0ErbU23GzDo{h5J*}NYeOpa36IxiZc6U{gg zlkzJ{m8!DAEPyx8q@o2Yw7h;(Q*+Vo{Cz>%IN(n@Ti(RcKBg4n<<_sdV6fH6t5ce% z6ed7w$t+EsIAwbp%G*yA?8@rmLaLdUmW#u^jWf0K%;!?ISP|2`P9Jn0>kZou!N>Ug zZuBwmDi>CP_c}f0dNycsfxH#Co(bn8eQsUgr49(Jt1oNWjp0NytIN9>gR4{wtTs*< z#Vu%vPEw%Y-^sfQ&b;V*4cGb%&IpwcUvY(EN5pfZg^46F>r-3Vwy;`cTI(40Ya=$_A4FDMdj?)YI4xz7cjx z1hCGHfv9*b4=ahN{&4nlj2I3W>m1GLDvm~_r*S~`uEhzLQbqSR?$zP z_soDi?zjvK#LNy{<2Wvjz;O47#1o7Jk{%2?xodw6g5M=dycu(%z+{yjzN|~DKtZ@} zBx{MkZd23WD3q-w$mz@+@_3$E8yUP;gbQC^=31EzqkF{YpYsEE-OC?Q3HJQEWZX0;# zS~=@jKo>9l#@K9`j(nvLU;~kP3gD~{r9LL7H(@M>cS(u^INmlN!T}V9Qs8m;@b(}u z!wir)b~H4?hVFsjp@M}6hN!>{v)F~lFKkfC_{EKui#-{Z4AH?S5()#lNlKzkYVd+p z_}uRhw_rofo8Ptr!P^67Z5FRzAob&Si*R;Fo7^X}Hgg^dn8fa1`c&4Y;N9SjO4Fwu z5nCG^>Vd-Ti=@jPdANnPynaC->~iOhO}N%QU@~vz0A=uukZQ4fgj>0bGw-wQqV zqe@Jwndgk;H1qnaovtk090i;<)NvEo?bdWA_YDpGgjS3N&Tx!7^NewNvpv~O#WUzc z=CS(iN;vC#(ILG&UjM2Ms}xvPo!4WcLMaZfLrK52WwL)xTGZ=WeQM4;Z_xPm`B@&X z?;Csq4|Cdd=gbj-K(`iG=kEyBS6J|@@!37prt9;;#4zT7X8mH0&1aWVsc@i?RGTE&N(ogMOfaUZs^4=0QU!;$4X eb1ounQt3am$%Wc21IpI`0000X1^@s6>a3*k00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0wPI7K~y+Tg_OOE z6Hye!XC?`28b6X^35$(jv+6&vDB7(SiV6k`F$npTg~dW-8#_S|6qU_42}oj*Dk6jw zf`}q^q6mWJ6k-#LSV*!-#@~H;8M9=P9C&&6yt(I{JMZ0zX@F9xv^pFPcTCf~n@Xkj zWNi_wd_I4CFc^Gv9A}$RVW^E3!D9DI%*TWvxKS(?A4AWG_7_S&TpU=0MOeWuH?m{^UqS5Hz zKp=3D@cVehSi!MbE|*Vg?!pxb;_>)z-se2wPvN}hVNSMPsZ@>%pJ1Ozzya8PzyAVZ zS2)78e!t(Y*Xu`w3uZ)uL?ZDO$IBc}UpT_`ZnyiYTCE-s?kN)B_?GD=LT9{Uoayy? zbvCe;-hM8ZyTkN&%oMUqMS^TL`whnvn%Z;An*gT=QvyMCp%d+On|IjNR8Y=jGKslP zI9x&STvG$L*Wqwj^{1zZzB^6QOTx+XPw?w>%}~fpd6cw{!v{ijnI!)R27?>1Sga#l zu+NE-))2G_C%69#zBw%rxK5OGh=liyQ^IlhLpz2x};sVC%*rNsCmg!w6r`ba%l nhFYz5kfYwgaqeaRhhh8!uEN?`O3yy>00000NkvXXu0mjf-=-xz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_attention.png b/app/src/main/res/drawable-xhdpi/ic_setting_attention.png new file mode 100644 index 0000000000000000000000000000000000000000..6e3d7d67375c38be43184cb820ffff74aa901d6c GIT binary patch literal 1957 zcmV;W2U_@vP)Px+Ur9tkRA>doT6=61MHv5P_Z}^GeH>4LKPZAJ6{G$^2}Lm!|3OH=NI>}m5D*)U z^pWxugBTwnw9uCbBu3FDmX;C=h!HHHKqC~4fLJZjS{@RVM|-{NJ$k!4ezSGYd+hG* z9esRBJ2T&Femnck%r~<~pbv>|*}^&9?r~BeFqS7IMFOxAO1lX_7Z1>Guc-LD54!{O z`(WfMUj1l5;GPGd^9Y3}DNw7XM*>a&(!>F2Fj*{z?Ik6*HFXUL5(3|~apN$lyStbY zx{y+sXrP}c73`Q&0%vjfsvTL6eN6K50#Qma7;%B8MMcRSR4l}9*8_#L7`_dQ34z}U zM>eJHsMt>kzCVLx7`(HvaIq+frRaBzLEmw!A@K7E{k8PU${&pw#{^I7>iEv4GbNPL zA|nnTScecVPq>w7<>fW8eCdL}zkYohc)j~DJZHyp)Yo#3zz1pNm2c^VktX=A;^N^# zpyxD#n$*|84ErNc>nN{Wtn~n#nj^Yrk69D~2L=^514iLRXJP((Y8V+$6?{j_m7N&l z&uAG9BwwQNCR;4j`iu&j`vnDW0F|oLlocK~Y83FpM*vvNKs_E1Z`_beMINi<$BY4P z=uot`0ChS+ymbqx*Q;%YlbEA0BXSiog<81Ru6?Md$GgzO$|_=FDNl(P6FGKCBUVG zgAOW$RQzXu08d>V06tJ8afEv*y`rL4;RnHY6%=HOK(FA_g}n{a#7DrMmj?u2u~8EK zYy;QModAIVn6k3KzUoyVJf>y_DbU&q?%lfpBuwo>hyeK`ee&ciC6x$HSOorlByeK0 zgKgQexPY_1OyeJhAqy4&NlOR&@)dCbXZGgIOh}$PmsP_ElfDTZEiJ1QrVL)*j3}L_ zFqJZC_H5u%Qi=W`|qJ}|4=1Lo??7X zqC%#c0^2zUo3wXbn#$rHW1eKFffR7dA8Zn?U)O|yTUZ90uqq*gf#h<@Ifth800>yh zphdVRrE)|9o0fwAe6yCQ-}%(%g}~*@n*B(G*zgvD{-1vl;j(qEY4gZ8Xo=D5~&S62hYw=fXoKX(oSmoDmdg#+G`mOY~#W1d{bhM=b{-Ma^# z`u%z;eIgU@-T}`6c65$Om&l?;BIhVC@5Jb5w*

)7%W+qepdh9z-a)UEtn@IlNzU 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 bqY>B#m9jur?7T_#00000NkvXXu0mjfcK0_8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_helper.png b/app/src/main/res/drawable-xhdpi/ic_setting_helper.png new file mode 100644 index 0000000000000000000000000000000000000000..b7411181271ef88317881b98857235db08313154 GIT binary patch literal 2265 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 UfKp @@ -44,7 +44,7 @@ + android:background="@color/background_color" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> @@ -84,7 +84,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="万" - android:textColor="@color/card_color_orange" + android:textColor="@color/orange" android:id="@+id/priceUnit" android:textSize="@dimen/text_size_12" android:layout_marginTop="5dp" diff --git a/app/src/main/res/layout/layout_main_footer.xml b/app/src/main/res/layout/layout_main_footer.xml index cff2045..0788960 100644 --- a/app/src/main/res/layout/layout_main_footer.xml +++ b/app/src/main/res/layout/layout_main_footer.xml @@ -20,26 +20,26 @@ diff --git a/app/src/main/res/layout/layout_main_header.xml b/app/src/main/res/layout/layout_main_header.xml index 80d2ce2..6fb0ac3 100644 --- a/app/src/main/res/layout/layout_main_header.xml +++ b/app/src/main/res/layout/layout_main_header.xml @@ -25,7 +25,7 @@ android:maxWidth="180dp" android:singleLine="true" android:text="AndroidFine" - android:textColor="@color/main_head_title" + android:textColor="@color/text_color_white" android:textSize="@dimen/text_size_20" /> \ No newline at end of file diff --git a/app/src/main/res/layout/member_content_view.xml b/app/src/main/res/layout/member_content_view.xml index 56fd3dc..37c0078 100755 --- a/app/src/main/res/layout/member_content_view.xml +++ b/app/src/main/res/layout/member_content_view.xml @@ -2,42 +2,134 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/member_head_view.xml b/app/src/main/res/layout/member_head_view.xml index b1c553a..027f4cc 100755 --- a/app/src/main/res/layout/member_head_view.xml +++ b/app/src/main/res/layout/member_head_view.xml @@ -8,53 +8,53 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" - android:layout_marginTop="40dp" - android:src="@drawable/ic_img_user_default" - android:contentDescription="@string/app_name" /> + android:layout_marginTop="30dp" + android:contentDescription="@string/app_name" + android:src="@drawable/ic_img_user_default" /> + android:textColor="@color/text_color_white" + android:textSize="16sp" /> + android:showDividers="middle"> + android:padding="13dp" + android:text="注册" + android:textColor="@color/text_color_white" + android:textSize="16sp" /> + android:padding="13dp" + android:text="登录" + android:textColor="@color/text_color_white" + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ee5510a..0ed2b15 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,19 +1,51 @@ - #EF3A19 - #EF3A19 - #f5f5f5 + + + + #fff8f8f8 + #EF3A19 + #EF3A19 + #f5f5f5 #343434 #FF601C - - #383838 + + #0081E1 + #323232 + #ffffff + #888888 + #A8A8A8 + #FF5B46 + #ffaaaaaa + #ff111111 + + #0081E1 + #0066FF + + + #48B7FF + #FF5B46 + #F3B720 + #D9D9D9 + #A8A8A8 + + + #B5B5B5 + + #00000000 + #66000000 + + + + #FFFFFF #000000 + #FFA500 #808080 #FF0000 #FFD700 @@ -22,47 +54,10 @@ #0000FF #800080 #FFC0CB - #FFA500 #FFFACD #DFDFDF #F5F5F5 #708090 #0083FF - - #ffffffff - #0e5986 - #ffffff - #ffffffff - #959595 - #ffffff - #efefef - - #fa8282 - #ff8048 - #ffd237 - #abbf4f - #55b3da - #ae7fc7 - - - #203c54 - #38c9ff - - - #49596b - #ff40ab5e - #d13939 - #292c35 - #ffffff - #fece00 - #919aac - #04d6fc - #20242b - #8e9aab - #d7dbe2 - #e6eaf0 - #ef3f2f - #d13a38 - \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ec029a8..ecb6b1d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -42,7 +42,7 @@ @color/vpi__background_holo_dark - -