From dabf6451e4820146d1a31137836c463ffd682d8a Mon Sep 17 00:00:00 2001 From: clock <1084991652clock@gmail.com> Date: Fri, 27 May 2016 16:54:49 +0800 Subject: [PATCH 01/39] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=92=8C=E5=AF=BC=E5=85=A5=E6=B5=81=E7=A8=8B=EF=BC=8C=E8=AF=A6?= =?UTF-8?q?=E8=A7=81README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- build.gradle | 9 +- libs/AndroidUtils.aar | Bin 0 -> 24073 bytes .../com/clock/study/StudyApplication.java | 16 +-- .../study/activity/CapturePhotoActivity.java | 43 +++----- .../study/activity/PhotoPreviewActivity.java | 6 -- .../clock/study/manager/FolderManager.java | 101 ++++++++++++++++++ 7 files changed, 130 insertions(+), 56 deletions(-) create mode 100644 libs/AndroidUtils.aar create mode 100644 src/main/java/com/clock/study/manager/FolderManager.java diff --git a/README.md b/README.md index bf02b20..03deee0 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,18 @@ ## 运行须知 -运行本代码的童鞋,需要先以 Library 的方式导入 [AndroidUtils](https://github.com/D-clock/AndroidUtils) , 因为本库部分代码依赖于 AndroidUtils 。请知悉! +- 本库clone到本地后,直接以 moudle 形式导入即可运行; +- 本库libs下有个**AndroidUtils.aar**的依赖包,是由[AndroidUtils](https://github.com/D-clock/AndroidUtils)代码编译生成; +- 想要查看**AndroidUtils.aar**中的源代码,可以参考[这里](https://github.com/D-clock/Doc/blob/master/Android/%E4%B8%AA%E4%BA%BA%E6%94%B6%E8%97%8F/%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8Baar%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.md) -## 最新更新(编辑于2016-05-22) +## 最新更新(编辑于2016-05-27) -增加调用系统相机拍照适配方案的文章 +- 优化拍照实现; +- 优化项目导入体验; ## 归档文章 - [你需要知道的Android拍照适配问题.md](notes/你需要知道的Android拍照适配问题.md) + [你需要知道的Android拍照适配问题](notes/你需要知道的Android拍照适配问题.md) ## 找我 diff --git a/build.gradle b/build.gradle index 2c109a4..29a1179 100644 --- a/build.gradle +++ b/build.gradle @@ -19,9 +19,16 @@ android { } } +repositories { + flatDir { + dirs 'libs' //this way we can find the .aar file in libs folder + } +} + dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile project(':androidutils') + compile(name: 'AndroidUtils', ext: 'aar') + //compile project(":AndroidUtils") compile 'com.android.support:appcompat-v7:23.2.1' } diff --git a/libs/AndroidUtils.aar b/libs/AndroidUtils.aar new file mode 100644 index 0000000000000000000000000000000000000000..4c7be31f56105a18e94ba1eec751c7066bb37ddf GIT binary patch literal 24073 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 + * Created by Clock on 2016/5/27. + */ +public class FolderManager { + + /** + * 应用程序在SD卡上的主目录名称 + */ + private final static String APP_FOLDER_NAME = "AndroidStudy"; + /** + * 存放图片目录名 + */ + private final static String PHOTO_FOLDER_NAME = "photo"; + /** + * 存放闪退日志目录名 + */ + private final static String CRASH_LOG_FOLDER_NAME = "crash"; + + + private FolderManager() { + } + + /** + * 获取app在sd卡上的主目录 + * + * @return 成功则返回目录,失败则返回null + */ + public static File getAppFolder() { + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + + File appFolder = new File(Environment.getExternalStorageDirectory(), APP_FOLDER_NAME); + return createOnNotFound(appFolder); + + } else { + return null; + } + } + + /** + * 获取应用存放图片的目录 + * + * @return 成功则返回目录名,失败则返回null + */ + public static File getPhotoFolder() { + File appFolder = getAppFolder(); + if (appFolder != null) { + + File photoFolder = new File(appFolder, PHOTO_FOLDER_NAME); + return createOnNotFound(photoFolder); + + } else { + return null; + } + } + + /** + * 获取闪退日志存放目录 + * + * @return + */ + public static File getCrashLogFolder() { + File appFolder = getAppFolder(); + if (appFolder != null) { + + File crashLogFolder = new File(appFolder, CRASH_LOG_FOLDER_NAME); + return createOnNotFound(crashLogFolder); + } else { + return null; + } + } + + /** + * 创建目录 + * + * @param folder + * @return 创建成功则返回目录,失败则返回null + */ + private static File createOnNotFound(File folder) { + if (folder == null) { + return null; + } + + if (!folder.exists()) { + folder.mkdirs(); + } + + if (folder.exists()) { + return folder; + } else { + return null; + } + } +} From d6697a582b8919434ef4974b2a22f7a3fdc1a6d3 Mon Sep 17 00:00:00 2001 From: clock <1084991652clock@gmail.com> Date: Wed, 8 Jun 2016 15:55:32 +0800 Subject: [PATCH 02/39] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=8C=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=85=BC=E5=AE=B9=E9=97=AE=E9=A2=98=EF=BC=8C=E8=AF=A6?= =?UTF-8?q?=E8=A7=81README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- build.gradle | 12 ++ .../study/activity/CapturePhotoActivity.java | 122 ++++++++++++++++-- .../clock/study/manager/FolderManager.java | 7 + src/main/res/values/strings.xml | 4 + 5 files changed, 137 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 03deee0..48fcbd4 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ - 本库libs下有个**AndroidUtils.aar**的依赖包,是由[AndroidUtils](https://github.com/D-clock/AndroidUtils)代码编译生成; - 想要查看**AndroidUtils.aar**中的源代码,可以参考[这里](https://github.com/D-clock/Doc/blob/master/Android/%E4%B8%AA%E4%BA%BA%E6%94%B6%E8%97%8F/%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8Baar%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81.md) -## 最新更新(编辑于2016-05-27) +## 最新更新(编辑于2016-06-08) -- 优化拍照实现; -- 优化项目导入体验; +- 兼容处理 Android M 版本的 Runtime Permission ; +- 优化 build.gradle ,提高导入 moudle 体验; ## 归档文章 diff --git a/build.gradle b/build.gradle index 29a1179..d52e2a3 100644 --- a/build.gradle +++ b/build.gradle @@ -32,3 +32,15 @@ dependencies { //compile project(":AndroidUtils") compile 'com.android.support:appcompat-v7:23.2.1' } + + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.1.0' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} \ No newline at end of file diff --git a/src/main/java/com/clock/study/activity/CapturePhotoActivity.java b/src/main/java/com/clock/study/activity/CapturePhotoActivity.java index 9cbe5d1..f0d813b 100644 --- a/src/main/java/com/clock/study/activity/CapturePhotoActivity.java +++ b/src/main/java/com/clock/study/activity/CapturePhotoActivity.java @@ -1,10 +1,20 @@ package com.clock.study.activity; +import android.Manifest; +import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.provider.Settings; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; +import android.widget.Toast; import com.clock.study.R; import com.clock.study.helper.CapturePhotoHelper; @@ -23,6 +33,11 @@ public class CapturePhotoActivity extends AppCompatActivity implements View.OnCl private final static String TAG = CapturePhotoActivity.class.getSimpleName(); private final static String EXTRA_RESTORE_PHOTO = "extra_restore_photo"; + /** + * 运行时权限申请码 + */ + private final static int RUNTIME_PERMISSION_REQUEST_CODE = 0x1; + private CapturePhotoHelper mCapturePhotoHelper; private File mRestorePhotoFile; @@ -32,8 +47,6 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera_take_photo); - mCapturePhotoHelper = new CapturePhotoHelper(this, FolderManager.getPhotoFolder()); - findViewById(R.id.iv_take_photo).setOnClickListener(this); } @@ -42,29 +55,62 @@ protected void onCreate(Bundle savedInstanceState) { protected void onSaveInstanceState(Bundle outState) { Log.i(TAG, "onSaveInstanceState"); super.onSaveInstanceState(outState); - mRestorePhotoFile = mCapturePhotoHelper.getPhoto(); - Log.i(TAG, "onSaveInstanceState , mRestorePhotoFile: " + mRestorePhotoFile); - if (mRestorePhotoFile != null) { - outState.putSerializable(EXTRA_RESTORE_PHOTO, mRestorePhotoFile); + if (mCapturePhotoHelper != null) { + mRestorePhotoFile = mCapturePhotoHelper.getPhoto(); + Log.i(TAG, "onSaveInstanceState , mRestorePhotoFile: " + mRestorePhotoFile); + if (mRestorePhotoFile != null) { + outState.putSerializable(EXTRA_RESTORE_PHOTO, mRestorePhotoFile); + } } - } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { Log.i(TAG, "onRestoreInstanceState"); super.onRestoreInstanceState(savedInstanceState); - mRestorePhotoFile = (File) savedInstanceState.getSerializable(EXTRA_RESTORE_PHOTO); - Log.i(TAG, "onRestoreInstanceState , mRestorePhotoFile: " + mRestorePhotoFile); - mCapturePhotoHelper.setPhoto(mRestorePhotoFile); + if (mCapturePhotoHelper != null) { + mRestorePhotoFile = (File) savedInstanceState.getSerializable(EXTRA_RESTORE_PHOTO); + Log.i(TAG, "onRestoreInstanceState , mRestorePhotoFile: " + mRestorePhotoFile); + mCapturePhotoHelper.setPhoto(mRestorePhotoFile); + } } @Override public void onClick(View v) { int viewId = v.getId(); if (viewId == R.id.iv_take_photo) { - mCapturePhotoHelper.capture(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //Android M 处理Runtime Permission + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {//检查是否有写入SD卡的授权 + Log.i(TAG, "granted permission!"); + turnOnCamera(); + } else { + Log.i(TAG, "denied permission!"); + if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + Log.i(TAG, "should show request permission rationale!"); + } + requestPermission(); + } + } else { + turnOnCamera(); + } + } + } + + /** + * 开启相机 + */ + private void turnOnCamera() { + if (mCapturePhotoHelper == null) { + mCapturePhotoHelper = new CapturePhotoHelper(this, FolderManager.getPhotoFolder()); } + mCapturePhotoHelper.capture(); + } + + /** + * 申请写入sd卡的权限 + */ + private void requestPermission() { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RUNTIME_PERMISSION_REQUEST_CODE); } @Override @@ -88,4 +134,58 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == RUNTIME_PERMISSION_REQUEST_CODE) { + for (int index = 0; index < permissions.length; index++) { + String permission = permissions[index]; + if (Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permission)) { + if (grantResults[index] == PackageManager.PERMISSION_GRANTED) { + Log.i(TAG, "onRequestPermissionsResult: permission is granted!"); + turnOnCamera(); + + } else { + showMissingPermissionDialog(); + + } + } + } + } + } + + /** + * 显示打开权限提示的对话框 + */ + private void showMissingPermissionDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.help); + builder.setMessage(R.string.help_content); + + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Toast.makeText(CapturePhotoActivity.this, R.string.camera_open_error, Toast.LENGTH_SHORT).show(); + finish(); + } + }); + + builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + turnOnSettings(); + } + }); + + builder.show(); + } + + /** + * 启动系统权限设置界面 + */ + private void turnOnSettings() { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.parse("package:" + getPackageName())); + startActivity(intent); + } } diff --git a/src/main/java/com/clock/study/manager/FolderManager.java b/src/main/java/com/clock/study/manager/FolderManager.java index 34f1851..19038e8 100644 --- a/src/main/java/com/clock/study/manager/FolderManager.java +++ b/src/main/java/com/clock/study/manager/FolderManager.java @@ -1,6 +1,13 @@ package com.clock.study.manager; +import android.Manifest; +import android.app.AlertDialog; +import android.content.Context; +import android.content.pm.PackageManager; import android.os.Environment; +import android.support.v4.app.ActivityCompat; + +import com.clock.study.R; import java.io.File; diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 881bb1d..de587c7 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -5,4 +5,8 @@ TakePhoto 显示到相册 未指定存储目录 + 帮助 + 当前权限被禁用,建议到设置界面开启权限! + 取消 + 设置 From 20154c4ea402afa38e396e69d08741d4e13ec6f7 Mon Sep 17 00:00:00 2001 From: clock <1084991652clock@gmail.com> Date: Sun, 12 Jun 2016 12:57:02 +0800 Subject: [PATCH 03/39] update build.gradle --- build.gradle | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/build.gradle b/build.gradle index d52e2a3..4f16e25 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,14 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.1.2' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + apply plugin: 'com.android.application' android { @@ -31,16 +42,4 @@ dependencies { compile(name: 'AndroidUtils', ext: 'aar') //compile project(":AndroidUtils") compile 'com.android.support:appcompat-v7:23.2.1' -} - - -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } } \ No newline at end of file From 7063149f3914dfc03961b5bd40a53d3d3b279eb4 Mon Sep 17 00:00:00 2001 From: clock <1084991652clock@gmail.com> Date: Wed, 22 Jun 2016 12:03:10 +0800 Subject: [PATCH 04/39] =?UTF-8?q?=E6=B7=BB=E5=8A=A0RecyclerView=E5=A4=A7?= =?UTF-8?q?=E5=85=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...erView \344\275\277\347\224\250\345\244\247\345\205\250.md" | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 "notes/RecyclerView \344\275\277\347\224\250\345\244\247\345\205\250.md" diff --git "a/notes/RecyclerView \344\275\277\347\224\250\345\244\247\345\205\250.md" "b/notes/RecyclerView \344\275\277\347\224\250\345\244\247\345\205\250.md" new file mode 100644 index 0000000..2712705 --- /dev/null +++ "b/notes/RecyclerView \344\275\277\347\224\250\345\244\247\345\205\250.md" @@ -0,0 +1,3 @@ +# RecyclerView 使用大全 + +整理罗列想要写的知识点 \ No newline at end of file From 307275224a3615631ef027ab56e93d97e660fd18 Mon Sep 17 00:00:00 2001 From: clock <1084991652clock@gmail.com> Date: Fri, 1 Jul 2016 21:30:31 +0800 Subject: [PATCH 05/39] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=A4=E7=AF=87?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E6=96=87=E7=AB=A0md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\232\204\345\217\221\345\261\225\346\274\224\350\277\233.md" | 0 ...6\267\261\345\205\245\344\275\277\347\224\250 RecyclerView.md" | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 "notes/Android\345\212\250\347\224\273\347\232\204\345\217\221\345\261\225\346\274\224\350\277\233.md" rename "notes/RecyclerView \344\275\277\347\224\250\345\244\247\345\205\250.md" => "notes/\346\267\261\345\205\245\344\275\277\347\224\250 RecyclerView.md" (100%) diff --git "a/notes/Android\345\212\250\347\224\273\347\232\204\345\217\221\345\261\225\346\274\224\350\277\233.md" "b/notes/Android\345\212\250\347\224\273\347\232\204\345\217\221\345\261\225\346\274\224\350\277\233.md" new file mode 100644 index 0000000..e69de29 diff --git "a/notes/RecyclerView \344\275\277\347\224\250\345\244\247\345\205\250.md" "b/notes/\346\267\261\345\205\245\344\275\277\347\224\250 RecyclerView.md" similarity index 100% rename from "notes/RecyclerView \344\275\277\347\224\250\345\244\247\345\205\250.md" rename to "notes/\346\267\261\345\205\245\344\275\277\347\224\250 RecyclerView.md" From 74dc69bdb80c0319b315d004ac958c337f33cc49 Mon Sep 17 00:00:00 2001 From: clock <1084991652clock@gmail.com> Date: Mon, 4 Jul 2016 18:15:48 +0800 Subject: [PATCH 06/39] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Android=20Animation?= =?UTF-8?q?=20=E4=BD=BF=E7=94=A8=E6=A0=97=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/AndroidManifest.xml | 1 + .../study/activity/AndroidAnimActivity.java | 97 +++++++++++++++++++ .../clock/study/activity/MainActivity.java | 4 + src/main/res/layout/activity_android_anim.xml | 40 ++++++++ src/main/res/layout/activity_main.xml | 9 +- 5 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/clock/study/activity/AndroidAnimActivity.java create mode 100644 src/main/res/layout/activity_android_anim.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 794c2b8..a270a85 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -29,6 +29,7 @@ android:name=".activity.PhotoPreviewActivity" android:label="@string/photo_preview" android:screenOrientation="portrait" /> + \ No newline at end of file diff --git a/src/main/java/com/clock/study/activity/AndroidAnimActivity.java b/src/main/java/com/clock/study/activity/AndroidAnimActivity.java new file mode 100644 index 0000000..32608e1 --- /dev/null +++ b/src/main/java/com/clock/study/activity/AndroidAnimActivity.java @@ -0,0 +1,97 @@ +package com.clock.study.activity; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.RotateAnimation; +import android.view.animation.ScaleAnimation; +import android.view.animation.TranslateAnimation; +import android.widget.Button; + +import com.clock.study.R; + +/** + * Android动画效果实现复习 + */ +public class AndroidAnimActivity extends AppCompatActivity implements View.OnClickListener { + + private Button mBtnTranslate; + private Button mBtnScale; + private Button mBtnRotate; + private Button mBtnAlpha; + private Button mBtnSet; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_android_anim); + + mBtnTranslate = (Button) findViewById(R.id.btn_translate); + mBtnTranslate.setOnClickListener(this); + + mBtnScale = (Button) findViewById(R.id.btn_scale); + mBtnScale.setOnClickListener(this); + + mBtnRotate = (Button) findViewById(R.id.btn_rotate); + mBtnRotate.setOnClickListener(this); + + mBtnAlpha = (Button) findViewById(R.id.btn_alpha); + mBtnAlpha.setOnClickListener(this); + + mBtnSet = (Button) findViewById(R.id.btn_set); + mBtnSet.setOnClickListener(this); + + } + + @Override + public void onClick(View v) { + int viewId = v.getId(); + if (viewId == R.id.btn_translate) {//偏移动画 + //TranslateAnimation translateAnim = new TranslateAnimation(0, 500, 0, 500); + /*TranslateAnimation translateAnim = new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 500, Animation.ABSOLUTE, 0, + Animation.ABSOLUTE, 500);*/ + TranslateAnimation translateAnim = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_PARENT, 0, + Animation.RELATIVE_TO_PARENT, 1.0f); + translateAnim.setDuration(2000); + mBtnTranslate.startAnimation(translateAnim); + //translateAnim.setFillAfter(true);//保持动画效果 + + } else if (viewId == R.id.btn_scale) {//缩放动画 + + //ScaleAnimation scaleAnim = new ScaleAnimation(0.5f, 1, 0.5f, 1); + //ScaleAnimation scaleAnim = new ScaleAnimation(0.5f, 1, 0.5f, 1, 300, 300); + ScaleAnimation scaleAnim = new ScaleAnimation(0.5f, 1, 0.5f, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + scaleAnim.setDuration(1000); + mBtnScale.startAnimation(scaleAnim); + + } else if (viewId == R.id.btn_rotate) {//旋转动画 + + //RotateAnimation rotateAnim = new RotateAnimation(0, 360); + //RotateAnimation rotateAnim = new RotateAnimation(0, 360, 100, 100); + RotateAnimation rotateAnim = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + rotateAnim.setDuration(2000); + mBtnRotate.startAnimation(rotateAnim); + + } else if (viewId == R.id.btn_alpha) {//透明度动画 + + AlphaAnimation alphaAnim = new AlphaAnimation(0, 1); + alphaAnim.setDuration(2000); + mBtnAlpha.startAnimation(alphaAnim); + + } else if (viewId == R.id.btn_set) {//动画合集 + + AnimationSet animSet = new AnimationSet(true); + animSet.setDuration(2000); + RotateAnimation rotateAnim = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + animSet.addAnimation(rotateAnim); + AlphaAnimation alphaAnim = new AlphaAnimation(0, 1); + animSet.addAnimation(alphaAnim); + mBtnSet.startAnimation(animSet); + + } + + } +} diff --git a/src/main/java/com/clock/study/activity/MainActivity.java b/src/main/java/com/clock/study/activity/MainActivity.java index 0637f11..3c26506 100644 --- a/src/main/java/com/clock/study/activity/MainActivity.java +++ b/src/main/java/com/clock/study/activity/MainActivity.java @@ -15,6 +15,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); findViewById(R.id.btn_camera_take_photo).setOnClickListener(this); + findViewById(R.id.btn_android_anim).setOnClickListener(this); } @Override @@ -23,6 +24,9 @@ public void onClick(View v) { if (viewId == R.id.btn_camera_take_photo) { Intent takePhotoIntent = new Intent(this, CapturePhotoActivity.class); startActivity(takePhotoIntent); + } else if (viewId == R.id.btn_android_anim) { + Intent androidAnimIntent = new Intent(this, AndroidAnimActivity.class); + startActivity(androidAnimIntent); } } } diff --git a/src/main/res/layout/activity_android_anim.xml b/src/main/res/layout/activity_android_anim.xml new file mode 100644 index 0000000..1804f66 --- /dev/null +++ b/src/main/res/layout/activity_android_anim.xml @@ -0,0 +1,40 @@ + + + +