├── .gitignore
├── README.md
├── app
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── xp
│ │ └── exercise
│ │ └── ApplicationTest.java
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ └── main_menu_list.json
│ ├── java
│ └── com
│ │ └── xp
│ │ └── exercise
│ │ ├── AppApplication.java
│ │ ├── Constant.java
│ │ ├── CrashCapture.java
│ │ ├── WelcomActivity.java
│ │ ├── canvas
│ │ ├── CanvasActivity.java
│ │ ├── secoo
│ │ │ ├── LineCircleTransitionView.java
│ │ │ ├── SoundWaveView.java
│ │ │ └── SpeedActivity.java
│ │ └── widget
│ │ │ ├── BezierRoundIndicatorView.java
│ │ │ ├── BezierThreeView.java
│ │ │ ├── BezierTwoView.java
│ │ │ ├── CanvasView.java
│ │ │ ├── CircleRippleView.java
│ │ │ ├── CircleWaveView.java
│ │ │ ├── CompassActivity.java
│ │ │ ├── CompassView.java
│ │ │ ├── FlowWaveView.java
│ │ │ ├── OclockView.java
│ │ │ ├── PaintView.java
│ │ │ ├── PathCubic.java
│ │ │ ├── PathView.java
│ │ │ ├── RadarImageView.java
│ │ │ └── TantanSearchView.java
│ │ ├── listview
│ │ ├── PullToChangeHeaderActivity.java
│ │ ├── SlowScrollListViewActivity.java
│ │ ├── adapter
│ │ │ └── SlowScrollAdapter.java
│ │ └── widget
│ │ │ └── ListViewForScrollView.java
│ │ ├── main
│ │ ├── MainActivity.java
│ │ ├── MainListEntity.java
│ │ └── MainMenuAdapter.java
│ │ ├── ontouch
│ │ ├── MainTouchActivity.java
│ │ ├── TouchNormalActivity.java
│ │ ├── TouchRecyclerActivity.java
│ │ ├── TouchScrollViewActivity.java
│ │ ├── view
│ │ │ ├── NormalRecyclerView.java
│ │ │ ├── NormalScrollView.java
│ │ │ ├── NormalView.java
│ │ │ └── NormalViewGroup.java
│ │ └── widgetdivider
│ │ │ ├── GridEntrust.java
│ │ │ ├── ItemDivider.java
│ │ │ ├── LinearEntrust.java
│ │ │ ├── SpacesItemDecoration.java
│ │ │ ├── SpacesItemDecorationEntrust.java
│ │ │ └── StaggeredGridEntrust.java
│ │ ├── statsbar
│ │ ├── FragmentStatusbarActivity.java
│ │ ├── FullScreenHaveStatusActivity.java
│ │ ├── StatusBarTextColor2Activity.java
│ │ ├── StatusBarTextColorActivity.java
│ │ ├── base
│ │ │ ├── CompatStatusBarActivity.java
│ │ │ └── StatusBarBaseActivity.java
│ │ ├── fragment
│ │ │ ├── TitleBlueFragment.java
│ │ │ ├── TitleImageFragment.java
│ │ │ ├── TitleRedFragment.java
│ │ │ └── TitleWhiteFragment.java
│ │ └── util
│ │ │ └── OsUtil.java
│ │ ├── toolbar
│ │ ├── BottomSheetActivity.java
│ │ ├── CollapsingToolbarActivity.java
│ │ ├── CollapsingToolbarSnapActivity.java
│ │ ├── CoordinatorLayoutActivity.java
│ │ ├── MyBehaviorActivity.java
│ │ ├── TitleImageBehaviorActivity.java
│ │ ├── behavior
│ │ │ ├── AvatarImageBehavior.java
│ │ │ ├── MyBottomBarBehavior.java
│ │ │ ├── MyFabBehavior.java
│ │ │ └── TopTitleBehavior.java
│ │ └── util
│ │ │ ├── SnackbarUtil.java
│ │ │ └── StatusBarUtil.java
│ │ ├── util
│ │ ├── AssetsUtil.java
│ │ ├── LogUtils.java
│ │ ├── MathUtil.java
│ │ ├── ToastUtils.java
│ │ └── UiUtil.java
│ │ ├── viewdraghelper
│ │ ├── MainViewDragHelperActivity.java
│ │ ├── lesson1
│ │ │ ├── DragLayoutOne.java
│ │ │ └── LessonOneActivity.java
│ │ ├── lesson2
│ │ │ ├── DragLayoutTwo.java
│ │ │ └── LessonTwoActivity.java
│ │ ├── lesson3
│ │ │ ├── DragLayoutThree.java
│ │ │ └── LessonThreeActivity.java
│ │ ├── lesson4
│ │ │ ├── DragLayoutFour.java
│ │ │ └── LessonFourActivity.java
│ │ └── lesson5
│ │ │ ├── DragLayoutFive.java
│ │ │ └── LessonFiveActivity.java
│ │ ├── viewgroup
│ │ ├── activity
│ │ │ ├── CustomViewGroupActivity.java
│ │ │ ├── MyLinearLayout.java
│ │ │ ├── PathMotionActivity.java
│ │ │ ├── ScrollerTestActivity.java
│ │ │ ├── SwitchActivity.java
│ │ │ └── VisibleActivity.java
│ │ └── view
│ │ │ └── CanvasViewGroup.java
│ │ └── viewpager
│ │ └── IndicatorViewPagerActivity.java
│ └── res
│ ├── anim
│ ├── activity_close_enter.xml
│ ├── activity_close_exit.xml
│ ├── activity_open_enter.xml
│ ├── activity_open_exit.xml
│ ├── activity_right_in.xml
│ ├── activity_right_out.xml
│ ├── fade_in.xml
│ ├── fade_out.xml
│ ├── listview_animation.xml
│ ├── push_left_in.xml
│ ├── push_left_out.xml
│ ├── push_right_in.xml
│ ├── push_right_out.xml
│ ├── radar_image_scale.xml
│ └── radar_search_animation.xml
│ ├── drawable-hdpi
│ └── ic_launcher.png
│ ├── drawable-mdpi
│ └── ic_launcher.png
│ ├── drawable-xhdpi
│ ├── background_mine_head.jpg
│ ├── explode1.png
│ ├── explode2.png
│ ├── explode3.png
│ ├── explode4.png
│ ├── explode5.png
│ ├── ic_launcher.png
│ ├── ic_mike_bg_1.png
│ ├── ic_mike_bg_2.png
│ ├── ic_mike_bg_3.png
│ ├── ic_mike_black.png
│ ├── ic_mike_gray.png
│ ├── ic_search_cricle.png
│ ├── icon_1.png
│ ├── icon_arraw_back.png
│ ├── icon_arraw_bottom.png
│ ├── icon_arraw_right.png
│ ├── icon_arraw_top.png
│ ├── img_001.jpg
│ ├── img_002.jpg
│ ├── img_003.jpg
│ ├── img_004.jpg
│ ├── img_005.jpg
│ ├── img_006.jpg
│ ├── img_007.jpg
│ ├── img_008.jpg
│ ├── img_009.jpg
│ ├── img_011.jpg
│ ├── img_012.jpg
│ ├── img_013.jpg
│ ├── radar.png
│ ├── radar_bg.png
│ ├── speech_close.png
│ ├── speech_line.png
│ ├── speech_mic.png
│ ├── speech_mic_circle.png
│ └── speech_mic_disable.png
│ ├── drawable-xxhdpi
│ ├── ic_arrow_back_white.png
│ ├── ic_launcher.png
│ ├── icon_arraw_back.png
│ ├── icon_back_white.png
│ ├── icon_cftx.png
│ ├── icon_more_white.png
│ ├── icon_red_start.png
│ ├── meinv_large.png
│ ├── meinv_small.png
│ └── qrcode.jpg
│ ├── drawable
│ ├── btn_blue_red_selector.xml
│ ├── btn_ripple_blue.xml
│ └── btn_white_gray_selector.xml
│ ├── layout
│ ├── activity_bottom_sheet.xml
│ ├── activity_circle_wave.xml
│ ├── activity_collpasing_snap_toolbar.xml
│ ├── activity_collpasing_toolbar.xml
│ ├── activity_compass.xml
│ ├── activity_compat_status_bar.xml
│ ├── activity_coordinator_layout.xml
│ ├── activity_fragment_statusbar.xml
│ ├── activity_fullscreen_havastatus.xml
│ ├── activity_lesson_five.xml
│ ├── activity_lesson_four.xml
│ ├── activity_lesson_one.xml
│ ├── activity_lesson_three.xml
│ ├── activity_lesson_two.xml
│ ├── activity_main.xml
│ ├── activity_my_behavior.xml
│ ├── activity_pathmotion.xml
│ ├── activity_pull_to_change.xml
│ ├── activity_radar_search.xml
│ ├── activity_scroller.xml
│ ├── activity_slow_scroll.xml
│ ├── activity_speed.xml
│ ├── activity_statusbar_text.xml
│ ├── activity_statusbar_text2.xml
│ ├── activity_switch.xml
│ ├── activity_title_image_behavior.xml
│ ├── activity_view_draghelper_main.xml
│ ├── activity_visible_invisible.xml
│ ├── activity_welcome.xml
│ ├── fragment_title_change.xml
│ ├── include_title_layout.xml
│ ├── include_toolbar_layout.xml
│ ├── item_img.xml
│ ├── item_listview_text.xml
│ ├── item_main_elv_child.xml
│ ├── item_main_elv_parent.xml
│ ├── item_touch_recycler.xml
│ ├── layout_lesson5_item.xml
│ ├── layout_list_item.xml
│ ├── line_circle_translate_view.xml
│ ├── listview_header_image.xml
│ ├── ontouch_activity_main.xml
│ ├── ontouch_activity_normal.xml
│ ├── ontouch_activity_recyclerview.xml
│ ├── ontouch_activity_scrollview.xml
│ ├── textview_normal.xml
│ ├── view_radar_search.xml
│ └── viewdrag_main.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-mdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ └── ic_launcher.png
│ ├── transition
│ ├── activity_switch_explode.xml
│ ├── activity_switch_slide.xml
│ └── trans_bounds.xml
│ ├── values-v11
│ └── styles.xml
│ ├── values-v14
│ └── styles.xml
│ └── values
│ ├── attrs.xml
│ ├── color.xml
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── screenshot
├── 721146199.png
├── draw
│ ├── canvas_bezier.jpg
│ ├── canvas_canvas.jpg
│ ├── canvas_demo.gif
│ ├── canvas_drag_red.gif
│ ├── canvas_wave.gif
│ ├── main_canvas.png
│ ├── mi_shizhong.gif
│ ├── secoo.gif
│ ├── tantan_search.gif
│ ├── water_wave.gif
│ └── zhinanzhen.gif
├── listview
│ └── secoo_list_move.gif
├── main_function.png
├── plugin_mine-debug.apk
├── plugin_order-debug.apk
├── qrcode.jpg
├── statusbar
│ ├── statusbar_fragment.jpg
│ └── statusbar_main.png
├── toolbar
│ ├── bottomsheet_behavior_baidu.gif
│ ├── custom_behavior_collaps.gif
│ ├── custom_behavior_zhihu.gif
│ ├── toolbar_collaps_collaps.gif
│ ├── toolbar_main.png
│ └── toolbar_normal_collaps.gif
└── touch
│ └── touch_main.jpg
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | app/build/
2 | *.iml
3 | .gradle
4 | /local.properties
5 | /.idea/workspace.xml
6 | /.idea/libraries
7 | .DS_Store
8 | /build
9 | /captures
10 | .externalNativeBuild
11 | /.idea/
12 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 27
5 | buildToolsVersion "28.0.3"
6 | defaultConfig {
7 | applicationId "com.xp.exercise"
8 | minSdkVersion 21
9 | targetSdkVersion 27
10 | versionCode 1
11 | versionName "1.0"
12 | javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 |
21 | compileOptions {
22 | sourceCompatibility JavaVersion.VERSION_1_8
23 | targetCompatibility JavaVersion.VERSION_1_8
24 | }
25 | }
26 |
27 | dependencies {
28 | implementation fileTree(include: ['*.jar'], dir: 'libs')
29 | final SUPPORT_LIBRARY_VERSION = '27.1.1'
30 | implementation "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
31 | implementation "com.android.support:cardview-v7:$SUPPORT_LIBRARY_VERSION"
32 | implementation "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
33 | implementation "com.android.support:recyclerview-v7:$SUPPORT_LIBRARY_VERSION"
34 | implementation 'com.android.support.constraint:constraint-layout:1.1.3'
35 | implementation 'de.hdodenhof:circleimageview:1.3.0'
36 | implementation 'com.jakewharton:butterknife:8.8.1'
37 | annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
38 | implementation 'me.imid.swipebacklayout.lib:library:1.1.0'
39 | implementation 'com.google.code.gson:gson:2.8.5'
40 | }
41 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in D:\java\Android\sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/xp/exercise/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/AppApplication.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise;
2 |
3 | import android.app.Application;
4 |
5 | import com.xp.exercise.util.LogUtils;
6 |
7 | /**
8 | * @类描述:应用常量类
9 | * @创建人:Wangxiaopan
10 | * @创建时间:2018/1/17 0017 14:30
11 | * @修改人:
12 | * @修改时间:2018/1/17 0017 14:30
13 | * @修改备注:
14 | */
15 |
16 | public class AppApplication extends Application {
17 | public static AppApplication INSTANCE;
18 | @Override
19 | public void onCreate() {
20 | super.onCreate();
21 | CrashCapture.getInstance().init(this);
22 | LogUtils.init(this);
23 | INSTANCE = this;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/WelcomActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise;
2 |
3 | import android.content.Intent;
4 | import android.graphics.Paint;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v7.app.AppCompatActivity;
8 | import android.view.View;
9 | import android.widget.TextView;
10 |
11 | import com.xp.exercise.main.MainActivity;
12 |
13 | /**
14 | * @类描述:欢迎页
15 | * @创建人:Wangxiaopan
16 | * @创建时间:2018/3/13 0013 15:08
17 | * @修改人:
18 | * @修改时间:2018/3/13 0013 15:08
19 | * @修改备注:
20 | */
21 |
22 | public class WelcomActivity extends AppCompatActivity{
23 | @Override
24 | protected void onCreate(@Nullable Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | setContentView(R.layout.activity_welcome);
27 | setFullScreen();
28 | TextView textView = (TextView) findViewById(R.id.welcom_to_main);
29 | textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
30 | textView.getPaint().setAntiAlias(true);
31 | textView.setOnClickListener(new View.OnClickListener() {
32 | @Override
33 | public void onClick(View v) {
34 | startActivity(new Intent(WelcomActivity.this,MainActivity.class));
35 | }
36 | });
37 | }
38 |
39 | private void setFullScreen(){
40 | //方式一 有actionBar
41 | // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
42 | //方式二 状态栏可拉下来 然后显示并停留
43 | // getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
44 | //方式三 style.xml中配置
45 | //
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/canvas/CanvasActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.canvas;
2 |
3 | import android.os.Bundle;
4 | import android.view.View;
5 |
6 | import com.xp.exercise.Constant;
7 | import com.xp.exercise.R;
8 | import com.xp.exercise.canvas.widget.BezierRoundIndicatorView;
9 | import com.xp.exercise.canvas.widget.BezierThreeView;
10 | import com.xp.exercise.canvas.widget.BezierTwoView;
11 | import com.xp.exercise.canvas.widget.CanvasView;
12 | import com.xp.exercise.canvas.widget.CircleWaveView;
13 | import com.xp.exercise.canvas.widget.FlowWaveView;
14 | import com.xp.exercise.canvas.widget.OclockView;
15 | import com.xp.exercise.canvas.widget.PaintView;
16 | import com.xp.exercise.canvas.widget.PathCubic;
17 | import com.xp.exercise.canvas.widget.PathView;
18 | import com.xp.exercise.statsbar.base.CompatStatusBarActivity;
19 |
20 | /**
21 | * @类描述:自定义View
22 | * @创建人:Wangxiaopan
23 | * @创建时间:2018/10/10 0010 17:29
24 | * @修改人:
25 | * @修改时间:2018/10/10 0010 17:29
26 | * @修改备注:
27 | */
28 | public class CanvasActivity extends CompatStatusBarActivity {
29 | private String tag;
30 |
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | super.onCreate(savedInstanceState);
34 | tag = getIntent().getStringExtra(Constant.EXTRA_CUSTOM_VIEW_TAG);
35 | View view = null;
36 | switch (tag) {
37 | case Constant.CUSTOM_VIEW_DRAW_CANVAS:
38 | view = new CanvasView(this);
39 | break;
40 | case Constant.CUSTOM_VIEW_DRAW_PAINT:
41 | view = new PaintView(this);
42 | break;
43 | case Constant.CUSTOM_VIEW_DRAW_PATH:
44 | view = new PathView(this);
45 | break;
46 | case Constant.CUSTOM_VIEW_DRAW_TWO_BEZIER:
47 | view = new BezierTwoView(this);
48 | break;
49 | case Constant.CUSTOM_VIEW_DRAW_THREE_BEZIER:
50 | view = new BezierThreeView(this);
51 | break;
52 | case Constant.CUSTOM_VIEW_DRAW_DEMO:
53 | view = new PathCubic(this);
54 | break;
55 | case Constant.CUSTOM_VIEW_DRAW_DRAG_BEZIER:
56 | view = new BezierRoundIndicatorView(this);
57 | break;
58 | case Constant.CUSTOM_VIEW_DRAW_COLLECTION:
59 | view = new FlowWaveView(this);
60 | break;
61 | case Constant.CUSTOM_VIEW_DRAW_RADAR_SEARCH:
62 | view = new CircleWaveView(this);
63 | break;
64 | case Constant.CUSTOM_VIEW_DRAW_TANTAN_SEARCH:
65 | view = getLayoutInflater().inflate(R.layout.activity_radar_search, null);
66 | break;
67 | case Constant.CUSTOM_VIEW_DRAW_CLOCK:
68 | view = new OclockView(this);
69 | break;
70 |
71 | }
72 | setContentView(view);
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/canvas/secoo/SpeedActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.canvas.secoo;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.FragmentActivity;
5 | import android.view.View;
6 | import android.view.View.OnClickListener;
7 |
8 | import com.xp.exercise.R;
9 |
10 | import java.util.Random;
11 |
12 | /**
13 | *
14 | * Function: 寺库 语音搜索效果研究
15 | *
16 | * @author wangxiaopan
17 | * @Date 2016-05-13
18 | */
19 | public class SpeedActivity extends FragmentActivity implements OnClickListener{
20 |
21 | private LineCircleTransitionView mLctView;
22 | private SoundWaveView mSwView;
23 | @Override
24 | protected void onCreate(Bundle bundle) {
25 | super.onCreate(bundle);
26 | setContentView(R.layout.activity_speed);
27 | initUI();
28 | }
29 |
30 | private void initUI(){
31 | findViewById(R.id.speed_start_circle).setOnClickListener(this);
32 | findViewById(R.id.speed_start_wave).setOnClickListener(this);
33 | mLctView = (LineCircleTransitionView) findViewById(R.id.speed_lct_view);
34 | mSwView = (SoundWaveView) findViewById(R.id.speed_sw_view);
35 | mSwView.reset();
36 | }
37 |
38 | private void startWave(){
39 | int[] waves = new int[]{0,1,2,3,4,5,6,7,8,9};
40 | Random random = new Random();
41 | // System.out.println("random = " + random.nextFloat());
42 | int volume = random.nextInt(10);
43 | mSwView.setSoundVolume(waves[volume]);
44 | }
45 |
46 | @Override
47 | public void onClick(View v) {
48 | switch (v.getId()) {
49 | case R.id.speed_start_circle:
50 | mLctView.transition();
51 | break;
52 | case R.id.speed_start_wave:
53 | startWave();
54 | break;
55 |
56 | }
57 |
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/canvas/widget/CompassActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.canvas.widget;
2 |
3 | import android.hardware.Sensor;
4 | import android.hardware.SensorEvent;
5 | import android.hardware.SensorEventListener;
6 | import android.hardware.SensorManager;
7 | import android.os.Bundle;
8 | import android.support.annotation.Nullable;
9 | import android.support.v7.app.AppCompatActivity;
10 |
11 | /**
12 | * @类描述:指南针
13 | * @创建人:Wangxiaopan
14 | * @创建时间:2018/2/26 0026 14:55
15 | * @修改人:
16 | * @修改时间:2018/2/26 0026 14:55
17 | * @修改备注:
18 | */
19 |
20 | public class CompassActivity extends AppCompatActivity {
21 |
22 | @Override
23 | protected void onCreate(@Nullable Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | //指南针
26 | setCompassView();
27 | }
28 |
29 | private CompassView mCompassView;
30 | private SensorManager mSensorManager;
31 | private SensorEventListener mSensorEventListener;
32 | private float val;
33 |
34 | //指南针View
35 | private void setCompassView() {
36 | mCompassView = new CompassView(this);
37 | mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
38 | mSensorEventListener = new SensorEventListener() {
39 | @Override
40 | public void onSensorChanged(SensorEvent event) {
41 | val = event.values[0];
42 | mCompassView.setVal(val);
43 | }
44 |
45 | @Override
46 | public void onAccuracyChanged(Sensor sensor, int accuracy) {
47 |
48 | }
49 | };
50 | mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
51 | SensorManager.SENSOR_DELAY_GAME);
52 |
53 | setContentView(mCompassView);
54 | }
55 |
56 | @Override
57 | protected void onDestroy() {
58 | super.onDestroy();
59 | if (null != mSensorManager) {
60 | mSensorManager.unregisterListener(mSensorEventListener);
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/canvas/widget/TantanSearchView.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.canvas.widget;
2 |
3 | import android.content.Context;
4 | import android.graphics.Canvas;
5 | import android.util.AttributeSet;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.View.OnClickListener;
9 | import android.view.animation.Animation;
10 | import android.view.animation.AnimationUtils;
11 | import android.widget.FrameLayout;
12 | import android.widget.ImageView;
13 |
14 | import com.xp.exercise.R;
15 |
16 | public class TantanSearchView extends FrameLayout implements OnClickListener {
17 |
18 | private ImageView mHeadImage;
19 | private ImageView mRadarImage;
20 | private CircleRippleView mCircleRippleView;
21 |
22 | public TantanSearchView(Context context) {
23 | super(context);
24 | initUI(context);
25 | }
26 |
27 | public TantanSearchView(Context context, AttributeSet attrs) {
28 | super(context, attrs);
29 | initUI(context);
30 | }
31 |
32 | public TantanSearchView(Context context, AttributeSet attrs, int defStyleAttr) {
33 | super(context, attrs, defStyleAttr);
34 | initUI(context);
35 | }
36 |
37 | private void initUI(Context context) {
38 | View view = LayoutInflater.from(context).inflate(R.layout.view_radar_search, this, true);
39 | mRadarImage = (ImageView) view.findViewById(R.id.radar_image);
40 | Animation mAnimation = AnimationUtils.loadAnimation(context, R.anim.radar_search_animation);
41 | mRadarImage.startAnimation(mAnimation);
42 |
43 | mCircleRippleView = (CircleRippleView) view.findViewById(R.id.radar_bg_image);
44 |
45 | mHeadImage = (ImageView) view.findViewById(R.id.radar_head_image);
46 | mHeadImage.setOnClickListener(this);
47 |
48 | }
49 |
50 | @Override
51 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
52 | // TODO Auto-generated method stub
53 | super.onMeasure(widthMeasureSpec, heightMeasureSpec);
54 | }
55 |
56 | @Override
57 | protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
58 | // TODO Auto-generated method stub
59 | super.onLayout(changed, left, top, right, bottom);
60 | // Log.d("Test", "changed = " + changed);
61 | // Log.d("Test", "left = " + left);
62 | // Log.d("Test", "top = " + top);
63 | // Log.d("Test", "right = " + right);
64 | // Log.d("Test", "bottom = " + bottom);
65 | // int count = getChildCount();
66 | // View view = getChildAt(0);
67 | // Log.d("Test", "view.count = " + count);
68 | // Log.d("Test", "view.width = " + view.getWidth());
69 | // Log.d("Test", "view.height = " + view.getHeight());
70 | if (changed) {
71 | }
72 | // LogUtils.d("Test","width = " + getWidth());
73 | // LogUtils.d("Test","height = " + getHeight());
74 | }
75 |
76 | @Override
77 | protected void onDraw(Canvas canvas) {
78 | super.onDraw(canvas);
79 | }
80 |
81 | @Override
82 | public void onClick(View v) {
83 | switch (v.getId()) {
84 | case R.id.radar_head_image:
85 | mCircleRippleView.startRipple();
86 | // ScaleAnimation animation =new ScaleAnimation(1f, 1.5f, 1f, 1.5f,
87 | // Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
88 | // animation.setDuration(1500);
89 | // mHeadImage.startAnimation(animation);
90 | Animation mAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.radar_image_scale);
91 | mHeadImage.startAnimation(mAnimation);
92 | break;
93 | }
94 | }
95 |
96 | }
97 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/listview/PullToChangeHeaderActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.listview;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.FragmentActivity;
5 | import android.util.Log;
6 | import android.view.View;
7 | import android.widget.AbsListView;
8 | import android.widget.ArrayAdapter;
9 | import android.widget.ImageView;
10 |
11 | import com.xp.exercise.R;
12 | import com.xp.exercise.listview.widget.ListViewForScrollView;
13 | import com.xp.exercise.listview.widget.ListViewForScrollView.OnMyListViewScrollListener;
14 |
15 | import java.util.ArrayList;
16 |
17 | /**
18 | *
19 | * Function: 下拉ListView header变大
20 | *
21 | * @author wangxiaopan
22 | * @Date 2016-05-50
23 | */
24 | public class PullToChangeHeaderActivity extends FragmentActivity implements OnMyListViewScrollListener,AbsListView.OnScrollListener {
25 | private ListViewForScrollView mListView;
26 | private ImageView mHeaderImage;
27 | private boolean mIsTop = false;
28 | private int mOriginHeight;
29 | @Override
30 | protected void onCreate(Bundle arg0) {
31 | super.onCreate(arg0);
32 | setContentView(R.layout.activity_pull_to_change);
33 | initUI();
34 | }
35 |
36 | private void initUI(){
37 | mListView = (ListViewForScrollView) findViewById(R.id.pull_to_change_listview);
38 | mListView.setOnScrollListener(this);
39 | mListView.setMyScrollListener(this);
40 | View header = View.inflate(this, R.layout.listview_header_image, null);
41 | mHeaderImage = (ImageView) header.findViewById(R.id.header_image);
42 | mListView.addHeaderView(header);
43 | ArrayList mData = new ArrayList();
44 | mData.add("String");
45 | mData.add("Integer");
46 | mData.add("long");
47 | mData.add("float");
48 | mData.add("double");
49 | mData.add("char");
50 | mData.add("boolean");
51 | mData.add("byte");
52 | mData.add("short");
53 | mData.add("c++");
54 | mData.add("java");
55 | mData.add("android");
56 | mData.add("ios");
57 | mData.add("php");
58 | mData.add("h5");
59 | mData.add("python");
60 | mData.add("boolean");
61 | mData.add("byte");
62 | mData.add("short");
63 | mData.add("c++");
64 | mData.add("java");
65 | mData.add("android");
66 | mData.add("ios");
67 | mData.add("php");
68 | mData.add("h5");
69 | mData.add("python");
70 | ArrayAdapter mAdapter = new ArrayAdapter(this, R.layout.item_listview_text, mData);
71 | mListView.setAdapter(mAdapter);
72 | }
73 |
74 | @Override
75 | public void onMyListViewScrollChange(int l, int t, int oldl, int oldt) {
76 | // Log.d("Test", "t = " + t + " oldt = " + oldt);
77 | if (t == 0) {
78 | mIsTop = true;
79 | mOriginHeight = mHeaderImage.getHeight();
80 | }
81 | }
82 |
83 | @Override
84 | public void onScrollStateChanged(AbsListView view, int scrollState) {
85 |
86 | }
87 |
88 | @Override
89 | public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
90 | Log.d("Test", "firstVisibleItem = " + firstVisibleItem + " visibleItemCount = " + visibleItemCount + " totalItemCount = " + totalItemCount);
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/listview/adapter/SlowScrollAdapter.java:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | */
4 | package com.xp.exercise.listview.adapter;
5 |
6 | import android.content.Context;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.BaseAdapter;
11 | import android.widget.ImageView;
12 | import android.widget.TextView;
13 |
14 | import com.xp.exercise.R;
15 | import com.xp.exercise.util.UiUtil;
16 |
17 | /**
18 | * Function:listView滑动item缓动适配器
19 | *
20 | * @author wangxiaopan
21 | * @Date 2016-03-22
22 | */
23 | public class SlowScrollAdapter extends BaseAdapter{
24 | private Context mContext;
25 | private int[] mImgs;
26 | private int mParentHeight,imgHeight;
27 | private LayoutInflater mLayoutInflater;
28 |
29 | public SlowScrollAdapter(Context context,int[] imgs) {
30 | this.mContext = context;
31 | this.mImgs = imgs;
32 | mLayoutInflater = LayoutInflater.from(context);
33 | final float scale = 320f / 750;
34 | final int screenWidth = UiUtil.getScreenWidth(context);
35 | mParentHeight = (int)(screenWidth * scale);
36 | imgHeight = (int)(screenWidth*500/750);
37 | }
38 |
39 | @Override
40 | public int getCount() {
41 | // TODO Auto-generated method stub
42 | return mImgs.length;
43 | }
44 |
45 | @Override
46 | public Object getItem(int position) {
47 | // TODO Auto-generated method stub
48 | return mImgs[position];
49 | }
50 |
51 | @Override
52 | public long getItemId(int position) {
53 | // TODO Auto-generated method stub
54 | return position;
55 | }
56 |
57 | @Override
58 | public View getView(int position, View convertView, ViewGroup parent) {
59 | ViewHolder holder;
60 | if (null == convertView) {
61 | convertView = mLayoutInflater.inflate(R.layout.item_img, parent, false);
62 |
63 | holder = new ViewHolder();
64 | holder.iconParent = convertView.findViewById(R.id.icon_parent_category_list_item);
65 | ViewGroup.LayoutParams params = holder.iconParent.getLayoutParams();
66 | params.height = mParentHeight;
67 | holder.iconParent.setLayoutParams(params);
68 |
69 | holder.icon = (ImageView)convertView.findViewById(R.id.icon_category_list_item);
70 | params = holder.icon.getLayoutParams();
71 | params.height = imgHeight;
72 | holder.icon.setLayoutParams(params);
73 | convertView.setTag(holder);
74 | }else {
75 | holder = (ViewHolder) convertView.getTag();
76 | }
77 | holder.icon.setImageResource(mImgs[position]);
78 | return convertView;
79 | }
80 |
81 | static class ViewHolder{
82 | ImageView icon;
83 | TextView name;
84 | View iconParent;
85 | }
86 |
87 | }
88 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/main/MainListEntity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.main;
2 |
3 | import java.util.ArrayList;
4 |
5 | /**
6 | * @类描述:首页 一级菜单
7 | * @创建人:Wangxiaopan
8 | * @创建时间:2018/10/25 0025 16:17
9 | * @修改人:
10 | * @修改时间:2018/10/25 0025 16:17
11 | * @修改备注:
12 | */
13 | public class MainListEntity {
14 | private ArrayList datas;
15 |
16 | public ArrayList getDatas() {
17 | return datas;
18 | }
19 |
20 | public void setDatas(ArrayList data) {
21 | this.datas = data;
22 | }
23 |
24 | public static class LevelOneEntity {
25 | private int id;
26 | private String title;
27 | private String tag;
28 | private ArrayList childs;
29 |
30 | public int getId() {
31 | return id;
32 | }
33 |
34 | public void setId(int id) {
35 | this.id = id;
36 | }
37 |
38 | public String getTag() {
39 | return tag;
40 | }
41 |
42 | public void setTag(String tag) {
43 | this.tag = tag;
44 | }
45 |
46 | public String getTitle() {
47 |
48 | return title;
49 | }
50 |
51 | public void setTitle(String title) {
52 | this.title = title;
53 | }
54 |
55 | public ArrayList getChilds() {
56 | return childs;
57 | }
58 |
59 | public void setChilds(ArrayList childs) {
60 | this.childs = childs;
61 | }
62 | }
63 |
64 | public static class LevelTwoEntity {
65 | private int id;
66 | private String tag;
67 | private String title;
68 |
69 | public int getId() {
70 | return id;
71 | }
72 |
73 | public void setId(int id) {
74 | this.id = id;
75 | }
76 |
77 | public String getTag() {
78 | return tag;
79 | }
80 |
81 | public void setTag(String tag) {
82 | this.tag = tag;
83 | }
84 |
85 | public String getTitle() {
86 | return title;
87 | }
88 |
89 | public void setTitle(String title) {
90 | this.title = title;
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/ontouch/MainTouchActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.ontouch;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.view.View;
6 |
7 | import com.xp.exercise.R;
8 | import com.xp.exercise.statsbar.base.CompatStatusBarActivity;
9 |
10 | /**
11 | * @类描述:应用常量类
12 | * @创建人:Wangxiaopan
13 | * @创建时间:2018/9/6 0006 18:24
14 | * @修改人:
15 | * @修改时间:2018/9/6 0006 18:24
16 | * @修改备注:
17 | */
18 | public class MainTouchActivity extends CompatStatusBarActivity implements View.OnClickListener {
19 | @Override
20 | protected void onCreate(Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.ontouch_activity_main);
23 | findViewById(R.id.ontouche_normal).setOnClickListener(this);
24 | findViewById(R.id.ontouche_recycler).setOnClickListener(this);
25 | findViewById(R.id.ontouche_scrollview).setOnClickListener(this);
26 | }
27 |
28 | @Override
29 | public void onClick(View v) {
30 | switch (v.getId()) {
31 | case R.id.ontouche_normal:
32 | startActivity(new Intent(MainTouchActivity.this, TouchNormalActivity.class));
33 | break;
34 | case R.id.ontouche_recycler:
35 | startActivity(new Intent(MainTouchActivity.this, TouchRecyclerActivity.class));
36 | break;
37 | case R.id.ontouche_scrollview:
38 | startActivity(new Intent(MainTouchActivity.this, TouchScrollViewActivity.class));
39 | break;
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/ontouch/TouchNormalActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.ontouch;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.view.MotionEvent;
6 |
7 | import com.xp.exercise.R;
8 | import com.xp.exercise.util.LogUtils;
9 |
10 | /**
11 | * @类描述:View 常规事件探索
12 | * @创建人:Wangxiaopan
13 | * @创建时间:2018/9/6 0006 18:38
14 | * @修改人:
15 | * @修改时间:2018/9/6 0006 18:38
16 | * @修改备注:
17 | */
18 | public class TouchNormalActivity extends AppCompatActivity {
19 | @Override
20 | protected void onCreate(Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.ontouch_activity_normal);
23 | }
24 |
25 | @Override
26 | public boolean dispatchTouchEvent(MotionEvent ev) {
27 | switch (ev.getAction()) {
28 | case MotionEvent.ACTION_DOWN:
29 | LogUtils.d("Test", "ACTION_DOWN");
30 | // return true;
31 | break;
32 | case MotionEvent.ACTION_MOVE:
33 | LogUtils.d("Test", "ACTION_MOVE");
34 | break;
35 |
36 | case MotionEvent.ACTION_UP:
37 | LogUtils.d("Test", "ACTION_UP");
38 | // return true;
39 | break;
40 | case MotionEvent.ACTION_CANCEL:
41 | LogUtils.d("Test", "ACTION_CANCEL");
42 | break;
43 | default:
44 | LogUtils.d("Test", "default");
45 | break;
46 |
47 | }
48 | return super.dispatchTouchEvent(ev);
49 | // return false
50 | // return true
51 | }
52 |
53 | @Override
54 | public boolean onTouchEvent(MotionEvent event) {
55 | switch (event.getAction()) {
56 | case MotionEvent.ACTION_DOWN:
57 | LogUtils.d("Test", "ACTION_DOWN");
58 | // return true
59 | break;
60 | case MotionEvent.ACTION_MOVE:
61 | LogUtils.d("Test", "ACTION_MOVE");
62 | break;
63 | case MotionEvent.ACTION_UP:
64 | LogUtils.d("Test", "ACTION_UP");
65 | break;
66 | case MotionEvent.ACTION_CANCEL:
67 | LogUtils.d("Test", "ACTION_CANCEL");
68 | break;
69 | default:
70 | LogUtils.d("Test", "default");
71 | break;
72 | }
73 | return super.onTouchEvent(event);
74 | // return true;
75 | // return false;
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/ontouch/view/NormalRecyclerView.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.ontouch.view;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.widget.RecyclerView;
6 | import android.util.AttributeSet;
7 | import android.view.MotionEvent;
8 |
9 | import com.xp.exercise.util.LogUtils;
10 |
11 | /**
12 | * @类描述:应用常量类
13 | * @创建人:Wangxiaopan
14 | * @创建时间:2018/9/10 0010 12:47
15 | * @修改人:
16 | * @修改时间:2018/9/10 0010 12:47
17 | * @修改备注:
18 | */
19 | public class NormalRecyclerView extends RecyclerView {
20 | public NormalRecyclerView(Context context) {
21 | super(context);
22 | }
23 |
24 | public NormalRecyclerView(Context context, @Nullable AttributeSet attrs) {
25 | super(context, attrs);
26 | }
27 |
28 | public NormalRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
29 | super(context, attrs, defStyle);
30 | }
31 |
32 | @Override
33 | public boolean dispatchTouchEvent(MotionEvent ev) {
34 | switch (ev.getAction()) {
35 | case MotionEvent.ACTION_DOWN:
36 | LogUtils.d("Test", "ACTION_DOWN");
37 | // return true;
38 | break;
39 | case MotionEvent.ACTION_MOVE:
40 | LogUtils.d("Test", "ACTION_MOVE");
41 | break;
42 | case MotionEvent.ACTION_UP:
43 | LogUtils.d("Test", "ACTION_UP");
44 | // return true;
45 | break;
46 | case MotionEvent.ACTION_CANCEL:
47 | LogUtils.d("Test", "ACTION_CANCEL");
48 | break;
49 | default:
50 | LogUtils.d("Test", "default");
51 | break;
52 | }
53 | return super.dispatchTouchEvent(ev);
54 | // return false;
55 | // return true;
56 | }
57 |
58 | @Override
59 | public boolean onInterceptTouchEvent(MotionEvent ev) {
60 | getParent().requestDisallowInterceptTouchEvent(true);
61 | switch (ev.getAction()) {
62 | case MotionEvent.ACTION_DOWN:
63 | LogUtils.d("Test", "ACTION_DOWN");
64 | // return true;
65 | break;
66 | case MotionEvent.ACTION_MOVE:
67 | LogUtils.d("Test", "ACTION_MOVE");
68 | // return true;
69 | break;
70 | case MotionEvent.ACTION_UP:
71 | LogUtils.d("Test", "ACTION_UP");
72 | // return true;
73 | break;
74 | case MotionEvent.ACTION_CANCEL:
75 | LogUtils.d("Test", "ACTION_CANCEL");
76 | break;
77 | default:
78 | LogUtils.d("Test", "default");
79 | break;
80 | }
81 | return super.onInterceptTouchEvent(ev);
82 | // return false;
83 | // return true;
84 | }
85 |
86 | @Override
87 | public boolean onTouchEvent(MotionEvent event) {
88 | switch (event.getAction()) {
89 | case MotionEvent.ACTION_DOWN:
90 | LogUtils.d("Test", "ACTION_DOWN");
91 | // return true;
92 | break;
93 | case MotionEvent.ACTION_MOVE:
94 | LogUtils.d("Test", "ACTION_MOVE");
95 | break;
96 | case MotionEvent.ACTION_UP:
97 | LogUtils.d("Test", "ACTION_UP");
98 | // return true;
99 | break;
100 | case MotionEvent.ACTION_CANCEL:
101 | LogUtils.d("Test", "ACTION_CANCEL");
102 | break;
103 | default:
104 | LogUtils.d("Test", "default");
105 | break;
106 | }
107 | return super.onTouchEvent(event);
108 | // return false;
109 | // return true;
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/ontouch/view/NormalScrollView.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.ontouch.view;
2 |
3 | import android.content.Context;
4 | import android.support.v4.widget.NestedScrollView;
5 | import android.util.AttributeSet;
6 | import android.view.MotionEvent;
7 |
8 | import com.xp.exercise.util.LogUtils;
9 |
10 | /**
11 | * @类描述:应用常量类
12 | * @创建人:Wangxiaopan
13 | * @创建时间:2018/9/11 0011 9:34
14 | * @修改人:
15 | * @修改时间:2018/9/11 0011 9:34
16 | * @修改备注:
17 | */
18 | public class NormalScrollView extends NestedScrollView {
19 | public NormalScrollView(Context context) {
20 | super(context);
21 | }
22 |
23 | public NormalScrollView(Context context, AttributeSet attrs) {
24 | super(context, attrs);
25 | }
26 |
27 | public NormalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
28 | super(context, attrs, defStyleAttr);
29 | }
30 |
31 | @Override
32 | public boolean dispatchTouchEvent(MotionEvent ev) {
33 | switch (ev.getAction()) {
34 | case MotionEvent.ACTION_DOWN:
35 | LogUtils.d("Test", "ACTION_DOWN");
36 | // return true;
37 | break;
38 | case MotionEvent.ACTION_MOVE:
39 | LogUtils.d("Test", "ACTION_MOVE");
40 | break;
41 | case MotionEvent.ACTION_UP:
42 | LogUtils.d("Test", "ACTION_UP");
43 | // return true;
44 | break;
45 | case MotionEvent.ACTION_CANCEL:
46 | LogUtils.d("Test", "ACTION_CANCEL");
47 | break;
48 | default:
49 | LogUtils.d("Test", "default");
50 | break;
51 | }
52 | return super.dispatchTouchEvent(ev);
53 | // return false;
54 | // return true;
55 | }
56 |
57 | @Override
58 | public boolean onInterceptTouchEvent(MotionEvent ev) {
59 | switch (ev.getAction()) {
60 | case MotionEvent.ACTION_DOWN:
61 | LogUtils.d("Test", "ACTION_DOWN");
62 | // return true;
63 | break;
64 | case MotionEvent.ACTION_MOVE:
65 | LogUtils.d("Test", "ACTION_MOVE");
66 | return true;
67 | // break;
68 | case MotionEvent.ACTION_UP:
69 | LogUtils.d("Test", "ACTION_UP");
70 | // return true;
71 | break;
72 | case MotionEvent.ACTION_CANCEL:
73 | LogUtils.d("Test", "ACTION_CANCEL");
74 | break;
75 | default:
76 | LogUtils.d("Test", "default");
77 | break;
78 | }
79 | return super.onInterceptTouchEvent(ev);
80 | // return false;
81 | // return true;
82 | }
83 |
84 | @Override
85 | public boolean onTouchEvent(MotionEvent event) {
86 | switch (event.getAction()) {
87 | case MotionEvent.ACTION_DOWN:
88 | LogUtils.d("Test", "ACTION_DOWN");
89 | // return true;
90 | break;
91 | case MotionEvent.ACTION_MOVE:
92 | LogUtils.d("Test", "ACTION_MOVE");
93 | break;
94 | case MotionEvent.ACTION_UP:
95 | LogUtils.d("Test", "ACTION_UP");
96 | // return true;
97 | break;
98 | case MotionEvent.ACTION_CANCEL:
99 | LogUtils.d("Test", "ACTION_CANCEL");
100 | break;
101 | default:
102 | LogUtils.d("Test", "default");
103 | break;
104 | }
105 | return super.onTouchEvent(event);
106 | // return false;
107 | // return true;
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/ontouch/widgetdivider/LinearEntrust.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.ontouch.widgetdivider;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Rect;
5 | import android.support.v7.widget.GridLayoutManager;
6 | import android.support.v7.widget.LinearLayoutManager;
7 | import android.support.v7.widget.RecyclerView;
8 | import android.view.View;
9 |
10 | /**
11 | * 作者:请叫我百米冲刺 on 2016/12/6 上午11:32
12 | * 邮箱:mail@hezhilin.cc
13 | */
14 |
15 | public class LinearEntrust extends SpacesItemDecorationEntrust {
16 |
17 |
18 | public LinearEntrust(int leftRight, int topBottom, int mColor) {
19 | super(leftRight, topBottom, mColor);
20 | }
21 |
22 | @Override
23 | public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
24 | LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
25 | //没有子view或者没有没有颜色直接return
26 | if (mDivider == null || layoutManager.getChildCount() == 0) {
27 | return;
28 | }
29 | int left;
30 | int right;
31 | int top;
32 | int bottom;
33 | final int childCount = parent.getChildCount();
34 | if (layoutManager.getOrientation() == GridLayoutManager.VERTICAL) {
35 | for (int i = 0; i < childCount - 1; i++) {
36 | final View child = parent.getChildAt(i);
37 | final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
38 | //将有颜色的分割线处于中间位置
39 | final float center = (layoutManager.getTopDecorationHeight(child) + 1 - topBottom) / 2;
40 | //计算下边的
41 | left = layoutManager.getLeftDecorationWidth(child);
42 | right = parent.getWidth() - layoutManager.getLeftDecorationWidth(child);
43 | top = (int) (child.getBottom() + params.bottomMargin + center);
44 | bottom = top + topBottom;
45 | mDivider.setBounds(left, top, right, bottom);
46 | mDivider.draw(c);
47 | }
48 | } else {
49 | for (int i = 0; i < childCount - 1; i++) {
50 | final View child = parent.getChildAt(i);
51 | final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
52 | //将有颜色的分割线处于中间位置
53 | final float center = (layoutManager.getLeftDecorationWidth(child) + 1 - leftRight) / 2;
54 | //计算右边的
55 | left = (int) (child.getRight() + params.rightMargin + center);
56 | right = left + leftRight;
57 | top = layoutManager.getTopDecorationHeight(child);
58 | bottom = parent.getHeight() - layoutManager.getTopDecorationHeight(child);
59 | mDivider.setBounds(left, top, right, bottom);
60 | mDivider.draw(c);
61 | }
62 | }
63 |
64 | }
65 |
66 | @Override
67 | public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
68 | LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
69 | //竖直方向的
70 | if (layoutManager.getOrientation() == LinearLayoutManager.VERTICAL) {
71 | //最后一项需要 bottom
72 | if (parent.getChildAdapterPosition(view) == layoutManager.getItemCount() - 1) {
73 | outRect.bottom = topBottom;
74 | }
75 | outRect.top = topBottom;
76 | outRect.left = leftRight;
77 | outRect.right = leftRight;
78 | } else {
79 | //最后一项需要right
80 | if (parent.getChildAdapterPosition(view) == layoutManager.getItemCount() - 1) {
81 | outRect.right = leftRight;
82 | }
83 | outRect.top = topBottom;
84 | outRect.left = leftRight;
85 | outRect.bottom = topBottom;
86 | }
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/ontouch/widgetdivider/SpacesItemDecoration.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.ontouch.widgetdivider;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Rect;
5 | import android.support.v7.widget.GridLayoutManager;
6 | import android.support.v7.widget.RecyclerView;
7 | import android.support.v7.widget.StaggeredGridLayoutManager;
8 | import android.view.View;
9 |
10 | /**
11 | * Created by Au61 on 2016/1/15.
12 | */
13 | public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
14 |
15 | private SpacesItemDecorationEntrust mEntrust;
16 | private int mColor;
17 | private int leftRight;
18 | private int topBottom;
19 |
20 |
21 | public SpacesItemDecoration(int leftRight, int topBottom) {
22 | this.leftRight = leftRight;
23 | this.topBottom = topBottom;
24 | }
25 |
26 | public SpacesItemDecoration(int leftRight, int topBottom, int mColor) {
27 | this(leftRight, topBottom);
28 | this.mColor = mColor;
29 | }
30 |
31 | @Override
32 | public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
33 | if (mEntrust == null) {
34 | mEntrust = getEntrust(parent.getLayoutManager());
35 | }
36 | mEntrust.onDraw(c, parent, state);
37 | super.onDraw(c, parent, state);
38 | }
39 |
40 | @Override
41 | public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
42 | if (mEntrust == null) {
43 | mEntrust = getEntrust(parent.getLayoutManager());
44 | }
45 | mEntrust.getItemOffsets(outRect, view, parent, state);
46 | }
47 |
48 | private SpacesItemDecorationEntrust getEntrust(RecyclerView.LayoutManager manager) {
49 | SpacesItemDecorationEntrust entrust = null;
50 | //要注意这边的GridLayoutManager是继承LinearLayoutManager,所以要先判断GridLayoutManager
51 | if (manager instanceof GridLayoutManager) {
52 | entrust = new GridEntrust(leftRight, topBottom, mColor);
53 | } else if (manager instanceof StaggeredGridLayoutManager) {
54 | entrust = new StaggeredGridEntrust(leftRight, topBottom, mColor);
55 | } else {//其他的都当做Linear来进行计算
56 | entrust = new LinearEntrust(leftRight, topBottom, mColor);
57 | }
58 | return entrust;
59 | }
60 |
61 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/ontouch/widgetdivider/SpacesItemDecorationEntrust.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.ontouch.widgetdivider;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Rect;
5 | import android.graphics.drawable.ColorDrawable;
6 | import android.graphics.drawable.Drawable;
7 | import android.support.v7.widget.RecyclerView;
8 | import android.view.View;
9 |
10 | /**
11 | * 作者:请叫我百米冲刺 on 2016/12/6 上午11:37
12 | * 邮箱:mail@hezhilin.cc
13 | */
14 |
15 | public abstract class SpacesItemDecorationEntrust {
16 |
17 | //color的传入方式是resouce.getcolor
18 | protected Drawable mDivider;
19 |
20 | protected int leftRight;
21 |
22 | protected int topBottom;
23 |
24 | public SpacesItemDecorationEntrust(int leftRight, int topBottom, int mColor) {
25 | this.leftRight = leftRight;
26 | this.topBottom = topBottom;
27 | if (mColor != 0) {
28 | mDivider = new ColorDrawable(mColor);
29 | }
30 | }
31 |
32 |
33 | abstract void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state);
34 |
35 | abstract void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state);
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/FullScreenHaveStatusActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 |
6 | import com.xp.exercise.R;
7 | import com.xp.exercise.statsbar.base.StatusBarBaseActivity;
8 |
9 | /**
10 | * @类描述:全屏 显示状态栏
11 | * @创建人:Wangxiaopan
12 | * @创建时间:2018/3/13 0013 16:13
13 | * @修改人:
14 | * @修改时间:2018/3/13 0013 16:13
15 | * @修改备注:
16 | */
17 |
18 | public class FullScreenHaveStatusActivity extends StatusBarBaseActivity {
19 | @Override
20 | protected void onCreate(@Nullable Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.activity_fullscreen_havastatus);
23 | //配置在theme里面
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/StatusBarTextColor2Activity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.widget.Toolbar;
6 |
7 | import com.xp.exercise.R;
8 | import com.xp.exercise.statsbar.base.CompatStatusBarActivity;
9 |
10 | /**
11 | * @类描述:适配白底标题栏(方案二)顶部添加View,改变View颜色
12 | * @创建人:Wangxiaopan
13 | * @创建时间:2018/3/15 0015 16:52
14 | * @修改人:
15 | * @修改时间:2018/3/15 0015 16:52
16 | * @修改备注:
17 | */
18 |
19 | public class StatusBarTextColor2Activity extends CompatStatusBarActivity {
20 | @Override
21 | protected void onCreate(@Nullable Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.activity_statusbar_text2);
24 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_next);
25 | int color = 0xffffffff;
26 | toolbar.setBackgroundColor(color);
27 | //此页面主要做的是当标题栏为白色的时候 适配状态栏透明的同时 修改添加View的颜色来的达到适配的目的
28 | setViewColorStatusBar(true, color);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/StatusBarTextColorActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.view.View;
6 | import android.widget.Button;
7 |
8 | import com.xp.exercise.R;
9 | import com.xp.exercise.statsbar.base.StatusBarBaseActivity;
10 |
11 | /**
12 | * @类描述:适配白底标题栏(方案一)改变状态栏字体颜色
13 | * @创建人:Wangxiaopan
14 | * @创建时间:2018/3/15 0015 11:35
15 | * @修改人:
16 | * @修改时间:2018/3/15 0015 11:35
17 | * @修改备注:
18 | */
19 |
20 | public class StatusBarTextColorActivity extends StatusBarBaseActivity {
21 | private boolean isChange;
22 | @Override
23 | protected void onCreate(@Nullable Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.activity_statusbar_text);
26 | //此页面主要做的是当标题栏为白色的时候 适配状态栏透明的同时 修改状态栏的字体颜色
27 | //因修改状态栏字体颜色只支持6.0以上系统,适配低版本的时候,我们修改状态栏颜色为浅灰色(大部分APP适配规则)
28 | int statusBarColor = 0xffcccccc;
29 | setColorStatusBar(true, statusBarColor);
30 |
31 | //测试加载完成以后再次修改状态栏字体颜色
32 | Button testButton = (Button) findViewById(R.id.btn_statusbar_text_test);
33 | testButton.setOnClickListener(new View.OnClickListener() {
34 | @Override
35 | public void onClick(View v) {
36 | if (!isChange) {
37 | isChange = true;
38 | setColorStatusBar(false, 0);
39 | } else {
40 | int statusBarColor = 0xffcccccc;
41 | setColorStatusBar(true, statusBarColor);
42 | isChange = false;
43 | }
44 | }
45 | });
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/base/CompatStatusBarActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar.base;
2 |
3 | import android.graphics.Color;
4 | import android.os.Build;
5 | import android.os.Bundle;
6 | import android.support.annotation.LayoutRes;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.FrameLayout;
11 |
12 | import com.xp.exercise.R;
13 | import com.xp.exercise.statsbar.util.OsUtil;
14 | import com.xp.exercise.util.UiUtil;
15 |
16 | /**
17 | * @类描述:适配白底标题栏(方案二)顶部添加View,改变View颜色。 基类
18 | * @创建人:Wangxiaopan
19 | * @创建时间:2018/3/15 0015 11:35
20 | * @修改人:
21 | * @修改时间:2018/3/15 0015 11:35
22 | * @修改备注:
23 | */
24 | public class CompatStatusBarActivity extends StatusBarBaseActivity {
25 |
26 | private FrameLayout mFrameLayoutContent;
27 | private View mViewStatusBarPlace;
28 |
29 | @Override
30 | protected void onCreate(Bundle savedInstanceState) {
31 | super.onCreate(savedInstanceState);
32 | super.setContentView(R.layout.activity_compat_status_bar);
33 |
34 | mViewStatusBarPlace = findViewById(R.id.view_status_bar_place);
35 | mFrameLayoutContent = (FrameLayout) findViewById(R.id.frame_layout_content_place);
36 |
37 | ViewGroup.LayoutParams params = mViewStatusBarPlace.getLayoutParams();
38 | params.height = UiUtil.getStatusBarHeight(this);
39 | mViewStatusBarPlace.setLayoutParams(params);
40 | }
41 |
42 | @Override
43 | public void setContentView(@LayoutRes int layoutResID) {
44 | //这里能够看到 我们这里其实是一个适配基类。布局中增加了一个View 用来适配状态栏的高度并调整颜色
45 | //contentLayout会将继承自这个Activity的页面的layout添加进去以达到通用的目的
46 | View contentView = LayoutInflater.from(this).inflate(layoutResID, null);
47 | mFrameLayoutContent.addView(contentView);
48 | }
49 |
50 | @Override
51 | public void setContentView(View view) {
52 | mFrameLayoutContent.addView(view);
53 | }
54 |
55 | /**
56 | * 根据版本不同 修改添加View的颜色
57 | * 适配白底标题栏(方案二)顶部添加View,改变View颜色
58 | * 适配方案2, 4.4以下的不适配,4.4-6.0修改View颜色为浅灰色,6.0以上修改View颜色为白色,修改状态栏字体颜色
59 | *
60 | * @param isLight 标题栏颜色是否为浅色(白色)
61 | */
62 | protected void setViewColorStatusBar(boolean isLight, int statusBarPlaceColor) {
63 | //6.0+ 小米 魅族 可以直接适配 一般情况下6.0以上都是透明
64 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M || OsUtil.isMIUI() || OsUtil.isFlyme()) {
65 | setStatusBarTextDark(isLight);
66 | setStatusBarPlaceColor(statusBarPlaceColor);
67 | } else {
68 | if (statusBarPlaceColor == Color.WHITE) {
69 | statusBarPlaceColor = 0xffcccccc;
70 | }
71 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //4.4以上修改为浅灰色
72 | setStatusBarPlaceColor(statusBarPlaceColor);
73 | } else { //4.4以下不适配
74 | setStatusBarPlaceVisible(false);
75 | }
76 | }
77 | }
78 |
79 | protected void setStatusBarPlaceVisible(boolean isVisible) {
80 | if (isVisible) {
81 | mViewStatusBarPlace.setVisibility(View.VISIBLE);
82 | } else {
83 | mViewStatusBarPlace.setVisibility(View.GONE);
84 | }
85 | }
86 |
87 | protected void setStatusBarPlaceColor(int statusColor) {
88 | if (mViewStatusBarPlace != null) {
89 | mViewStatusBarPlace.setBackgroundColor(statusColor);
90 | }
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/fragment/TitleBlueFragment.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar.fragment;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v4.app.Fragment;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 | import android.widget.TextView;
10 |
11 | import com.xp.exercise.R;
12 |
13 | /**
14 | * @类描述:状态栏切换fragment
15 | * @创建人:Wangxiaopan
16 | * @创建时间:2018/3/16 0016 14:15
17 | * @修改人:
18 | * @修改时间:2018/3/16 0016 14:15
19 | * @修改备注:
20 | */
21 |
22 | public class TitleBlueFragment extends Fragment {
23 | private ViewGroup mTitleLayout;
24 | private TextView mTitleText;
25 |
26 | @Nullable
27 | @Override
28 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
29 | return inflater.inflate(R.layout.fragment_title_change, null);
30 | }
31 |
32 | @Override
33 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
34 | super.onViewCreated(view, savedInstanceState);
35 | initViews(view);
36 | }
37 |
38 | private void initViews(View view) {
39 | mTitleLayout = (ViewGroup) view.findViewById(R.id.fragment_title_bg_layout);
40 | mTitleText = (TextView) view.findViewById(R.id.fragment_title_text);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/fragment/TitleImageFragment.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar.fragment;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v4.app.Fragment;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 |
10 | import com.xp.exercise.R;
11 |
12 | /**
13 | * @类描述:状态栏切换fragment
14 | * @创建人:Wangxiaopan
15 | * @创建时间:2018/3/16 0016 14:15
16 | * @修改人:
17 | * @修改时间:2018/3/16 0016 14:15
18 | * @修改备注:
19 | */
20 |
21 | public class TitleImageFragment extends Fragment {
22 |
23 | @Nullable
24 | @Override
25 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
26 | return inflater.inflate(R.layout.activity_fullscreen_havastatus, null);
27 | }
28 |
29 | @Override
30 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
31 | super.onViewCreated(view, savedInstanceState);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/fragment/TitleRedFragment.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar.fragment;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v4.app.Fragment;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 | import android.widget.TextView;
10 |
11 | import com.xp.exercise.R;
12 |
13 | /**
14 | * @类描述:状态栏切换fragment
15 | * @创建人:Wangxiaopan
16 | * @创建时间:2018/3/16 0016 14:15
17 | * @修改人:
18 | * @修改时间:2018/3/16 0016 14:15
19 | * @修改备注:
20 | */
21 |
22 | public class TitleRedFragment extends Fragment {
23 | private ViewGroup mTitleLayout;
24 | private TextView mTitleText;
25 |
26 | @Nullable
27 | @Override
28 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
29 | return inflater.inflate(R.layout.fragment_title_change, null);
30 | }
31 |
32 | @Override
33 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
34 | super.onViewCreated(view, savedInstanceState);
35 | initViews(view);
36 | }
37 |
38 | private void initViews(View view) {
39 | mTitleLayout = (ViewGroup) view.findViewById(R.id.fragment_title_bg_layout);
40 | mTitleText = (TextView) view.findViewById(R.id.fragment_title_text);
41 | mTitleLayout.setBackgroundColor(getResources().getColor(R.color.colorAccent));
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/fragment/TitleWhiteFragment.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar.fragment;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v4.app.Fragment;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 | import android.widget.TextView;
10 |
11 | import com.xp.exercise.R;
12 |
13 | /**
14 | * @类描述:状态栏切换fragment
15 | * @创建人:Wangxiaopan
16 | * @创建时间:2018/3/16 0016 14:15
17 | * @修改人:
18 | * @修改时间:2018/3/16 0016 14:15
19 | * @修改备注:
20 | */
21 |
22 | public class TitleWhiteFragment extends Fragment {
23 | private ViewGroup mTitleLayout;
24 | private TextView mTitleText, mTextContent;
25 |
26 | @Nullable
27 | @Override
28 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
29 | return inflater.inflate(R.layout.fragment_title_change, null);
30 | }
31 |
32 | @Override
33 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
34 | super.onViewCreated(view, savedInstanceState);
35 | initViews(view);
36 | }
37 |
38 | private void initViews(View view) {
39 | mTitleLayout = (ViewGroup) view.findViewById(R.id.fragment_title_bg_layout);
40 | mTitleText = (TextView) view.findViewById(R.id.fragment_title_text);
41 | mTitleLayout.setBackgroundColor(getResources().getColor(R.color.white));
42 | mTitleText.setTextColor(getResources().getColor(R.color.tv_tips1));
43 | mTextContent = (TextView) view.findViewById(R.id.fragment_content);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/statsbar/util/OsUtil.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.statsbar.util;
2 |
3 | import android.os.Build;
4 | import android.text.TextUtils;
5 |
6 | import java.io.BufferedReader;
7 | import java.io.IOException;
8 | import java.io.InputStreamReader;
9 | import java.lang.reflect.Method;
10 |
11 | public class OsUtil {
12 |
13 | public static boolean isMIUI() {
14 | return !TextUtils.isEmpty(getSystemProperty("ro.miui.ui.version.name"));
15 | }
16 |
17 | public static boolean isFlyme() {
18 | try {
19 | final Method method = Build.class.getMethod("hasSmartBar");
20 | return method != null;
21 | } catch (final Exception e) {
22 | return false;
23 | }
24 | }
25 |
26 | private static String getSystemProperty(String propName) {
27 | String line;
28 | BufferedReader input = null;
29 | try {
30 | Process p = Runtime.getRuntime().exec("getprop " + propName);
31 | input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
32 | line = input.readLine();
33 | input.close();
34 | } catch (IOException ex) {
35 | return null;
36 | } finally {
37 | if (input != null) {
38 | try {
39 | input.close();
40 | } catch (IOException e) {
41 | e.printStackTrace();
42 | }
43 | }
44 | }
45 | return line;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/toolbar/CollapsingToolbarActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.toolbar;
2 |
3 | import android.graphics.Color;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.design.widget.AppBarLayout;
7 | import android.support.design.widget.CollapsingToolbarLayout;
8 | import android.support.v7.app.AppCompatActivity;
9 | import android.support.v7.widget.Toolbar;
10 | import android.view.View;
11 | import android.widget.ImageView;
12 |
13 | import com.xp.exercise.R;
14 |
15 | /**
16 | * @类描述:简单折叠标题栏(不能自动折叠(到一定位置))
17 | * @创建人:Wangxiaopan
18 | * @创建时间:2018/1/16 0016 16:46
19 | * @修改人:
20 | * @修改时间:2018/1/16 0016 16:46
21 | * @修改备注:
22 | */
23 |
24 | public class CollapsingToolbarActivity extends AppCompatActivity {
25 | private ImageView ivBigImg;
26 | private AppBarLayout ablLayout;
27 | private CollapsingToolbarLayout ctbLayout;
28 | private Toolbar tbLayout;
29 |
30 | @Override
31 | protected void onCreate(@Nullable Bundle savedInstanceState) {
32 | super.onCreate(savedInstanceState);
33 | setContentView(R.layout.activity_collpasing_toolbar);
34 | initViews();
35 | }
36 |
37 | private void initViews() {
38 | ivBigImg = (ImageView) findViewById(R.id.iv_collapsing_meinv);
39 | ablLayout = (AppBarLayout) findViewById(R.id.abl_collapsing_appbar);
40 | tbLayout = (Toolbar) findViewById(R.id.tb_collapse);
41 | ctbLayout = (CollapsingToolbarLayout) findViewById(R.id.ctb_collapsing_layout);
42 | //设置ToolBar
43 | setSupportActionBar(tbLayout);
44 | getSupportActionBar().setDisplayHomeAsUpEnabled(true);
45 | tbLayout.setNavigationOnClickListener(new View.OnClickListener() {
46 | @Override
47 | public void onClick(View v) {
48 | onBackPressed();
49 | }
50 | });
51 | //设置CollapsingToolbarLayout
52 | ctbLayout.setTitle("CollapsingToolbarLayout");
53 | //通过CollapsingToolbarLayout修改字体颜色
54 | ctbLayout.setExpandedTitleColor(Color.WHITE);
55 | ctbLayout.setCollapsedTitleTextColor(Color.RED);
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/toolbar/CollapsingToolbarSnapActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.toolbar;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.design.widget.AppBarLayout;
6 | import android.support.design.widget.CollapsingToolbarLayout;
7 | import android.support.v7.app.AppCompatActivity;
8 | import android.support.v7.widget.Toolbar;
9 | import android.view.View;
10 | import android.view.animation.AlphaAnimation;
11 |
12 | import com.xp.exercise.R;
13 |
14 | /**
15 | * @类描述:折叠标题栏(可自动折叠)
16 | * @创建人:Wangxiaopan
17 | * @创建时间:2018/1/16 0016 16:46
18 | * @修改人:
19 | * @修改时间:2018/1/16 0016 16:46
20 | * @修改备注:
21 | */
22 |
23 | public class CollapsingToolbarSnapActivity extends AppCompatActivity {
24 | // 控制ToolBar的变量
25 |
26 | private static final int ALPHA_ANIMATIONS_DURATION = 350;
27 |
28 | private boolean mIsTheTitleVisible = false;
29 | private AppBarLayout ablLayout;
30 | private CollapsingToolbarLayout ctbLayout;
31 | private Toolbar tbLayout;
32 |
33 | @Override
34 | protected void onCreate(@Nullable Bundle savedInstanceState) {
35 | super.onCreate(savedInstanceState);
36 | setContentView(R.layout.activity_collpasing_snap_toolbar);
37 | initViews();
38 | }
39 |
40 | private void initViews() {
41 | ablLayout = (AppBarLayout) findViewById(R.id.abl_collapsing_snap_appbar);
42 | tbLayout = (Toolbar) findViewById(R.id.tb_collapsing_snap);
43 | ctbLayout = (CollapsingToolbarLayout) findViewById(R.id.ctb_collapsing_snap_layout);
44 | // //设置ToolBar
45 | tbLayout.setTitle("标题");
46 | setSupportActionBar(tbLayout);
47 | getSupportActionBar().setDisplayHomeAsUpEnabled(true);
48 | tbLayout.setNavigationOnClickListener(new View.OnClickListener() {
49 | @Override
50 | public void onClick(View v) {
51 | onBackPressed();
52 | }
53 | });
54 | //Toolbar 在 CollapsingToolbar里面 设置外层ToolBar(下面的) 不然直接设备Toolbar(上面的)
55 | // //设置CollapsingToolbarLayout
56 | // ctbLayout.setTitle("CollapsingToolbarLayout");
57 | // //通过CollapsingToolbarLayout修改字体颜色
58 | // ctbLayout.setExpandedTitleColor(Color.WHITE);
59 | // ctbLayout.setCollapsedTitleTextColor(Color.RED);
60 | ablLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
61 | @Override
62 | public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
63 | int maxScroll = appBarLayout.getTotalScrollRange();
64 | float percentage = (float) Math.abs(verticalOffset) / (float) maxScroll;
65 | handleToolbarTitleVisibility(percentage);
66 | }
67 | });
68 | }
69 |
70 | private void handleToolbarTitleVisibility(float percentage) {
71 | if (percentage >= 0.9) {
72 | if (!mIsTheTitleVisible) {
73 | startAlphaAnimation(tbLayout, ALPHA_ANIMATIONS_DURATION, View.VISIBLE);
74 | mIsTheTitleVisible = true;
75 | }
76 | } else {
77 | if (mIsTheTitleVisible) {
78 | startAlphaAnimation(tbLayout, ALPHA_ANIMATIONS_DURATION, View.INVISIBLE);
79 | mIsTheTitleVisible = false;
80 | }
81 | }
82 | }
83 |
84 | // 设置渐变的动画 这个动画要是根据距离滑动 然后渐变就更好了。
85 | public static void startAlphaAnimation(View v, long duration, int visibility) {
86 | AlphaAnimation alphaAnimation = (visibility == View.VISIBLE)
87 | ? new AlphaAnimation(0f, 1f)
88 | : new AlphaAnimation(1f, 0f);
89 |
90 | alphaAnimation.setDuration(duration);
91 | alphaAnimation.setFillAfter(true);
92 | v.startAnimation(alphaAnimation);
93 | }
94 |
95 | }
96 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/toolbar/CoordinatorLayoutActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.toolbar;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.design.widget.AppBarLayout;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.support.v7.widget.Toolbar;
8 | import android.text.TextUtils;
9 |
10 | import com.xp.exercise.Constant;
11 | import com.xp.exercise.R;
12 |
13 | /**
14 | * @类描述:CoordinatorLayout 使用
15 | * @创建人:Wangxiaopan
16 | * @创建时间:2018/1/17 0017 9:58
17 | * @修改人:
18 | * @修改时间:2018/1/17 0017 9:58
19 | * @修改备注:
20 | */
21 |
22 | public class CoordinatorLayoutActivity extends AppCompatActivity {
23 | private AppBarLayout ablLayout;
24 | private Toolbar tbLayout;
25 |
26 |
27 | private String mScrollFlag;
28 |
29 | @Override
30 | protected void onCreate(@Nullable Bundle savedInstanceState) {
31 | super.onCreate(savedInstanceState);
32 | setContentView(R.layout.activity_coordinator_layout);
33 | mScrollFlag = getIntent().getStringExtra(Constant.EXTRA_SCROLL_FLAGS);
34 | if (TextUtils.isEmpty(mScrollFlag)) {
35 | mScrollFlag = Constant.EXTRA_SCROLL;
36 | }
37 | initViews();
38 | }
39 |
40 | private void initViews() {
41 | ablLayout = (AppBarLayout) findViewById(R.id.abl_layout_coordinator);
42 | tbLayout = (Toolbar) findViewById(R.id.tb_layout_coordinator);
43 | AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) tbLayout.getLayoutParams();
44 | switch (mScrollFlag) {
45 | case Constant.EXTRA_SCROLL: //标题栏随着 ScrollView 滚出滚进
46 | params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL);
47 | break;
48 | case Constant.EXTRA_SCROLL_ENTERALWAYS: //发生向下滚动的时候优先滚动子View(ToolBar(标题栏))
49 | params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
50 | break;
51 | case Constant.EXTRA_SCROLL_ENTERALWAYS_ENTERALWAYSCOLLPASED: //发生向下滚动的时候优先滚动子View(ToolBar(标题栏))到设置的minHeigh高度,当ScrooView向下滚动完毕,在展开全部高度的子View
52 | params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
53 | | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED);
54 | break;
55 | case Constant.EXTRA_SCROLL_EXITUNTILCOLLAPSED: //发生向上滚动的时候优先滚动子View(ToolBar(标题栏))到设置的minHeigh高度,当ScrooView向下滚动完毕,在展开全部高度的子View
56 | params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
57 | break;
58 | case Constant.EXTRA_SCROLL_SPAN: //就是子View的一个吸附效果,子View不会存在局部显示的情况,滚动子View的部分高度,当松开手指子View要么向上全部滚出屏幕,要么向下全部滚进屏幕
59 | params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP);
60 | break;
61 | default:
62 | break;
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/toolbar/MyBehaviorActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.toolbar;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.support.v7.widget.Toolbar;
7 |
8 | import com.xp.exercise.R;
9 | import com.xp.exercise.toolbar.util.StatusBarUtil;
10 |
11 | /**
12 | * @类描述:类似知乎(上下两个标题栏)
13 | * @创建人:Wangxiaopan
14 | * @创建时间:2018/1/18 0018 14:46
15 | * @修改人:
16 | * @修改时间:2018/1/18 0018 14:46
17 | * @修改备注:
18 | */
19 |
20 | public class MyBehaviorActivity extends AppCompatActivity {
21 | @Override
22 | protected void onCreate(@Nullable Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.activity_my_behavior);
25 | StatusBarUtil.setStatusBarColor(MyBehaviorActivity.this, R.color.colorPrimaryDark);//设置状态栏颜色
26 | Toolbar toolbar = (Toolbar) findViewById(R.id.tb_my_behavior);
27 | setSupportActionBar(toolbar);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/toolbar/behavior/MyBottomBarBehavior.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.toolbar.behavior;
2 |
3 | import android.content.Context;
4 | import android.support.design.widget.AppBarLayout;
5 | import android.support.design.widget.CoordinatorLayout;
6 | import android.util.AttributeSet;
7 | import android.view.View;
8 |
9 | /**
10 | * Created by wangxp on 2018/1/4.
11 | */
12 |
13 | public class MyBottomBarBehavior extends CoordinatorLayout.Behavior {
14 |
15 |
16 | public MyBottomBarBehavior(Context context, AttributeSet attrs) {
17 | super(context, attrs);
18 | }
19 |
20 | @Override
21 | public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
22 | //这个方法是说明这个子控件是依赖AppBarLayout的
23 | return dependency instanceof AppBarLayout;
24 | }
25 |
26 |
27 | @Override
28 | public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
29 |
30 | float translationY = Math.abs(dependency.getTop());//获取更随布局的顶部位置
31 | child.setTranslationY(translationY);
32 | return true;
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/toolbar/behavior/MyFabBehavior.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.toolbar.behavior;
2 |
3 | import android.animation.Animator;
4 | import android.content.Context;
5 | import android.support.design.widget.CoordinatorLayout;
6 | import android.support.v4.view.ViewCompat;
7 | import android.support.v4.view.animation.FastOutSlowInInterpolator;
8 | import android.util.AttributeSet;
9 | import android.view.View;
10 | import android.view.ViewPropertyAnimator;
11 | import android.view.animation.Interpolator;
12 |
13 | /**
14 | * Created by wangxp on 2018/1/4.
15 | */
16 |
17 | public class MyFabBehavior extends CoordinatorLayout.Behavior {
18 |
19 | private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
20 |
21 | private float viewY;//控件距离coordinatorLayout底部距离
22 | private boolean isAnimate;//动画是否在进行
23 |
24 | public MyFabBehavior(Context context, AttributeSet attrs) {
25 | super(context, attrs);
26 |
27 | }
28 |
29 | @Override
30 | public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
31 |
32 | if (child.getVisibility() == View.VISIBLE && viewY == 0) {
33 | //获取控件距离父布局(coordinatorLayout)底部距离
34 | viewY = coordinatorLayout.getHeight() - child.getY();
35 | }
36 |
37 | return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;//判断是否竖直滚动
38 | }
39 |
40 | @Override
41 | public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
42 | // Log.d("Test","dy = " + dy);
43 | //大于0是向上滚动 小于0是向下滚动
44 |
45 | if (dy >= 0 && !isAnimate && child.getVisibility() == View.VISIBLE) {
46 | hide(child);
47 | } else if (dy < 0 && !isAnimate && child.getVisibility() == View.GONE) {
48 | show(child);
49 | }
50 | }
51 |
52 | //隐藏时的动画
53 | private void hide(final View view) {
54 | ViewPropertyAnimator animator = view.animate().translationY(viewY).setInterpolator(INTERPOLATOR).setDuration(200);
55 |
56 | animator.setListener(new Animator.AnimatorListener() {
57 | @Override
58 | public void onAnimationStart(Animator animator) {
59 | isAnimate = true;
60 | }
61 |
62 | @Override
63 | public void onAnimationEnd(Animator animator) {
64 | view.setVisibility(View.GONE);
65 | isAnimate = false;
66 | }
67 |
68 | @Override
69 | public void onAnimationCancel(Animator animator) {
70 | show(view);
71 | }
72 |
73 | @Override
74 | public void onAnimationRepeat(Animator animator) {
75 |
76 | }
77 | });
78 | animator.start();
79 | }
80 |
81 | //显示时的动画
82 | private void show(final View view) {
83 | ViewPropertyAnimator animator = view.animate().translationY(0).setInterpolator(INTERPOLATOR).setDuration(200);
84 | animator.setListener(new Animator.AnimatorListener() {
85 | @Override
86 | public void onAnimationStart(Animator animator) {
87 | view.setVisibility(View.VISIBLE);
88 | isAnimate = true;
89 | }
90 |
91 | @Override
92 | public void onAnimationEnd(Animator animator) {
93 | isAnimate = false;
94 | }
95 |
96 | @Override
97 | public void onAnimationCancel(Animator animator) {
98 | hide(view);
99 | }
100 |
101 | @Override
102 | public void onAnimationRepeat(Animator animator) {
103 |
104 | }
105 | });
106 | animator.start();
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/toolbar/behavior/TopTitleBehavior.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.toolbar.behavior;
2 |
3 | import android.content.Context;
4 | import android.support.design.widget.CoordinatorLayout;
5 | import android.support.v7.widget.Toolbar;
6 | import android.util.AttributeSet;
7 | import android.view.View;
8 | import android.widget.TextView;
9 |
10 | /**
11 | * Created by wangxp on 18/1/22.
12 | */
13 | public class TopTitleBehavior extends CoordinatorLayout.Behavior {
14 | private int mFrameMaxHeight = 100;
15 | private int mStartY;
16 |
17 | @Override
18 | public boolean layoutDependsOn(CoordinatorLayout parent, TextView child, View dependency) {
19 | return dependency instanceof Toolbar;
20 | }
21 |
22 | public TopTitleBehavior(Context context, AttributeSet attrs) {
23 | super(context, attrs);
24 | }
25 |
26 | @Override
27 | public boolean onDependentViewChanged(CoordinatorLayout parent, TextView child, View dependency) {
28 | //记录开始的Y坐标 也就是toolbar起始Y坐标
29 | if (mStartY == 0) {
30 | mStartY = (int) dependency.getY();
31 | }
32 |
33 | //计算toolbar从开始移动到最后的百分比
34 | float percent = dependency.getY() / mStartY;
35 |
36 | //改变child的坐标(从消失,到可见)
37 | child.setY(child.getHeight() * (1 - percent) - child.getHeight());
38 | return true;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/util/AssetsUtil.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.util;
2 |
3 | import android.content.Context;
4 | import android.content.res.AssetManager;
5 | import android.graphics.Bitmap;
6 | import android.graphics.BitmapFactory;
7 |
8 | import java.io.BufferedReader;
9 | import java.io.IOException;
10 | import java.io.InputStream;
11 | import java.io.InputStreamReader;
12 |
13 | /**
14 | * Created by wangxp on 2018/8/11. 获取Assets下文件工具类
15 | */
16 | public class AssetsUtil {
17 | /**
18 | * 获取assert目录下的文件
19 | *
20 | * @param context
21 | * @param fileName
22 | * @return
23 | */
24 | public static String getFromAssets(Context context, String fileName) {
25 | try {
26 | InputStreamReader inputReader = new InputStreamReader(context.getResources().getAssets().open(fileName));
27 | BufferedReader bufReader = new BufferedReader(inputReader);
28 | String line = "";
29 | String Result = "";
30 | while ((line = bufReader.readLine()) != null)
31 | Result += line;
32 | return Result;
33 | } catch (Exception e) {
34 | e.printStackTrace();
35 | }
36 | return "";
37 | }
38 |
39 | public static Bitmap getImageFromAssetsFile(Context ct, String fileName) {
40 | Bitmap image = null;
41 | AssetManager am = ct.getAssets();
42 | try {
43 | InputStream is = am.open(fileName);
44 | image = BitmapFactory.decodeStream(is);
45 | is.close();
46 | } catch (IOException e) {
47 | e.printStackTrace();
48 | }
49 | return image;
50 |
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/util/MathUtil.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.util;
2 |
3 | import android.graphics.PointF;
4 |
5 | /**
6 | * @类描述:Math 计算工具类
7 | * @创建人:Wangxiaopan
8 | * @创建时间:2018/10/10 0010 17:43
9 | * @修改人:
10 | * @修改时间:2018/10/10 0010 17:43
11 | * @修改备注:
12 | */
13 |
14 | public class MathUtil {
15 |
16 |
17 | /**
18 | * 获得两点之间的直线距离
19 | *
20 | * @param p1 PointF
21 | * @param p2 PointF
22 | * @return 两点之间的直线距离
23 | */
24 | public static float getTwoPointDistance(PointF p1, PointF p2) {
25 | return (float) Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
26 | }
27 |
28 | /**
29 | * 根据两个点(x1,y1)(x2,y2)的坐标算出斜率
30 | *
31 | * @param x1 x1
32 | * @param x2 x2
33 | * @param y1 y1
34 | * @param y2 y2
35 | * @return 斜率
36 | */
37 | public static Float getLineSlope(float x1, float x2, float y1, float y2) {
38 | if (x2 - x1 == 0) return null;
39 | return (y2 - y1) / (x2 - x1);
40 | }
41 |
42 | /**
43 | * 根据传入的两点得到斜率
44 | *
45 | * @param p1 PointF
46 | * @param p2 PointF
47 | * @return 返回斜率
48 | */
49 | public static Float getLineSlope(PointF p1, PointF p2) {
50 | if (p2.x - p1.x == 0) return null;
51 | return (p2.y - p1.y) / (p2.x - p1.x);
52 | }
53 |
54 | /**
55 | * Get middle point between p1 and p2.
56 | * 获得两点连线的中点
57 | *
58 | * @param p1 PointF
59 | * @param p2 PointF
60 | * @return 中点
61 | */
62 | public static PointF getMiddlePoint(PointF p1, PointF p2) {
63 | return new PointF((p1.x + p2.x) / 2.0f, (p1.y + p2.y) / 2.0f);
64 | }
65 |
66 |
67 | /**
68 | * Get the point of intersection between circle and line.
69 | * 获取 通过指定圆心,斜率为lineK的直线与圆的交点。
70 | *
71 | * @param pMiddle The circle center point.
72 | * @param radius The circle radius.
73 | * @param lineK The slope of line which cross the pMiddle.
74 | * @return
75 | */
76 | public static PointF[] getIntersectionPoints(PointF pMiddle, float radius, Float lineK) {
77 | PointF[] points = new PointF[2];
78 |
79 | float radian, xOffset = 0, yOffset = 0;
80 | if (lineK != null) {
81 | radian = (float) Math.atan(lineK);
82 | xOffset = (float) (Math.sin(radian) * radius);
83 | yOffset = (float) (Math.cos(radian) * radius);
84 | } else {
85 | xOffset = radius;
86 | yOffset = 0;
87 | }
88 | points[0] = new PointF(pMiddle.x + xOffset, pMiddle.y - yOffset);
89 | points[1] = new PointF(pMiddle.x - xOffset, pMiddle.y + yOffset);
90 |
91 | return points;
92 | }
93 |
94 |
95 | }
96 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewdraghelper/MainViewDragHelperActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewdraghelper;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v4.app.FragmentActivity;
6 | import android.view.View;
7 |
8 | import com.xp.exercise.R;
9 | import com.xp.exercise.viewdraghelper.lesson1.LessonOneActivity;
10 | import com.xp.exercise.viewdraghelper.lesson2.LessonTwoActivity;
11 | import com.xp.exercise.viewdraghelper.lesson3.LessonThreeActivity;
12 | import com.xp.exercise.viewdraghelper.lesson4.LessonFourActivity;
13 | import com.xp.exercise.viewdraghelper.lesson5.LessonFiveActivity;
14 |
15 | /**
16 | * @类描述:ViewDragHelper研究
17 | * @创建人:Wangxiaopan
18 | * @创建时间:2018/10/10 0010 17:29
19 | * @修改人:
20 | * @修改时间:2018/10/10 0010 17:29
21 | * @修改备注: 原创地址 https://github.com/wangjia55/ViewDragHelper
22 | * 因此项目过老,下载以后运行失败,懒得改。因此直接拷贝到本项目中
23 | * 后续有时间继续研究修改
24 | */
25 | public class MainViewDragHelperActivity extends FragmentActivity {
26 |
27 | @Override
28 | protected void onCreate(Bundle savedInstanceState) {
29 | super.onCreate(savedInstanceState);
30 | setContentView(R.layout.activity_view_draghelper_main);
31 | }
32 |
33 | public void lessonOne(View view) {
34 | Intent intent = new Intent(this, LessonOneActivity.class);
35 | startActivity(intent);
36 | }
37 |
38 | public void lessonTwo(View view) {
39 | Intent intent = new Intent(this, LessonTwoActivity.class);
40 | startActivity(intent);
41 | }
42 |
43 | public void lessonThree(View view) {
44 | Intent intent = new Intent(this, LessonThreeActivity.class);
45 | startActivity(intent);
46 | }
47 |
48 | public void lessonFour(View view) {
49 | Intent intent = new Intent(this, LessonFourActivity.class);
50 | startActivity(intent);
51 | }
52 |
53 | public void lessonFive(View view) {
54 | Intent intent = new Intent(this, LessonFiveActivity.class);
55 | startActivity(intent);
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewdraghelper/lesson1/LessonOneActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewdraghelper.lesson1;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.FragmentActivity;
5 | import android.view.View;
6 |
7 | import com.xp.exercise.R;
8 | import com.xp.exercise.util.ToastUtils;
9 |
10 | /**
11 | * Created by jacob-wj on 2015/4/14.
12 | */
13 | public class LessonOneActivity extends FragmentActivity {
14 |
15 | @Override
16 | protected void onCreate(Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | setContentView(R.layout.activity_lesson_one);
19 | findViewById(R.id.dragview).setOnClickListener(new View.OnClickListener() {
20 | @Override
21 | public void onClick(View v) {
22 | ToastUtils.showLongToast("点击了");
23 | }
24 | });
25 | }
26 |
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewdraghelper/lesson2/LessonTwoActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewdraghelper.lesson2;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.FragmentActivity;
5 |
6 | import com.xp.exercise.R;
7 |
8 |
9 | /**
10 | * Created by jacob-wj on 2015/4/14.
11 | */
12 | public class LessonTwoActivity extends FragmentActivity {
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 | setContentView(R.layout.activity_lesson_two);
18 | }
19 |
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewdraghelper/lesson3/LessonThreeActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewdraghelper.lesson3;
2 |
3 | import android.content.Context;
4 | import android.os.Bundle;
5 | import android.support.v4.app.FragmentActivity;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 | import android.widget.ArrayAdapter;
10 | import android.widget.ImageView;
11 | import android.widget.ListView;
12 | import android.widget.TextView;
13 |
14 | import com.xp.exercise.R;
15 |
16 |
17 | /**
18 | * Created by jacob-wj on 2015/4/14.
19 | */
20 | public class LessonThreeActivity extends FragmentActivity {
21 |
22 | private ListView mListView;
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_lesson_three);
28 | setupListView();
29 | }
30 |
31 | private void setupListView() {
32 | mListView = (ListView) findViewById(R.id.listView);
33 | SampleAdapter adapter = new SampleAdapter(this);
34 | for (int i = 0; i < 20; i++) {
35 | adapter.add(new SampleItem("Love Android", android.R.drawable.star_on));
36 | }
37 | mListView.setAdapter(adapter);
38 | }
39 |
40 |
41 | private class SampleItem {
42 | public String tag;
43 | public int iconRes;
44 |
45 | public SampleItem(String tag, int iconRes) {
46 | this.tag = tag;
47 | this.iconRes = iconRes;
48 | }
49 | }
50 |
51 | public class SampleAdapter extends ArrayAdapter {
52 |
53 | public SampleAdapter(Context context) {
54 | super(context, 0);
55 | }
56 |
57 | public View getView(int position, View convertView, ViewGroup parent) {
58 | if (convertView == null) {
59 | convertView = LayoutInflater.from(getContext()).inflate(R.layout.layout_list_item, null);
60 | }
61 | ImageView icon = (ImageView) convertView.findViewById(R.id.row_icon);
62 | icon.setImageResource(getItem(position).iconRes);
63 | TextView title = (TextView) convertView.findViewById(R.id.row_title);
64 | title.setText(getItem(position).tag);
65 |
66 | return convertView;
67 | }
68 |
69 | }
70 |
71 |
72 | }
73 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewdraghelper/lesson4/LessonFourActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewdraghelper.lesson4;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.FragmentActivity;
5 | import android.util.Log;
6 | import android.view.View;
7 | import android.widget.Button;
8 |
9 | import com.xp.exercise.R;
10 |
11 |
12 | /**
13 | * Created by jacob-wj on 2015/4/14.
14 | */
15 | public class LessonFourActivity extends FragmentActivity implements View.OnClickListener {
16 |
17 | private Button mButtonHidden;
18 | private Button mButtonQueen;
19 |
20 | @Override
21 | protected void onCreate(Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.activity_lesson_four);
24 |
25 | mButtonHidden = (Button) findViewById(R.id.button_hidden);
26 | mButtonQueen = (Button) findViewById(R.id.button_queen);
27 |
28 | mButtonHidden.setOnClickListener(this);
29 | mButtonQueen.setOnClickListener(this);
30 | }
31 |
32 |
33 | @Override
34 | public void onClick(View v) {
35 | Button button = (Button) v;
36 | Log.e("OnClick:", button.getText().toString());
37 |
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewdraghelper/lesson5/LessonFiveActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewdraghelper.lesson5;
2 |
3 | import android.content.Context;
4 | import android.os.Bundle;
5 | import android.support.v4.app.FragmentActivity;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 | import android.widget.ArrayAdapter;
10 | import android.widget.ListView;
11 | import android.widget.TextView;
12 |
13 | import com.xp.exercise.R;
14 |
15 |
16 | /**
17 | * Created by jacob-wj on 2015/4/14.
18 | */
19 | public class LessonFiveActivity extends FragmentActivity implements View.OnClickListener {
20 | private ListView mListView;
21 |
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.activity_lesson_five);
26 | setupListView();
27 |
28 | }
29 |
30 | private void setupListView() {
31 | mListView = (ListView) findViewById(R.id.listView);
32 | SampleAdapter adapter = new SampleAdapter(this);
33 | for (int i = 0; i < 20; i++) {
34 | adapter.add(new SampleItem("Love Android"));
35 | }
36 | mListView.setAdapter(adapter);
37 | }
38 |
39 |
40 | private class SampleItem {
41 | public String tag;
42 |
43 | public SampleItem(String tag) {
44 | this.tag = tag;
45 | }
46 | }
47 |
48 | public class SampleAdapter extends ArrayAdapter {
49 |
50 | public SampleAdapter(Context context) {
51 | super(context, 0);
52 | }
53 |
54 | public View getView(int position, View convertView, ViewGroup parent) {
55 | if (convertView == null) {
56 | convertView = LayoutInflater.from(getContext()).inflate(R.layout.layout_lesson5_item, null);
57 | }
58 | TextView title = (TextView) convertView.findViewById(R.id.text_view_name);
59 | title.setText(getItem(position).tag);
60 |
61 | return convertView;
62 | }
63 |
64 | }
65 |
66 | @Override
67 | public void onClick(View v) {
68 |
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewgroup/activity/CustomViewGroupActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewgroup.activity;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.view.View;
6 |
7 | import com.xp.exercise.statsbar.base.StatusBarBaseActivity;
8 | import com.xp.exercise.util.LogUtils;
9 | import com.xp.exercise.viewgroup.view.CanvasViewGroup;
10 |
11 | /**
12 | * @类描述:应用常量类
13 | * @创建人:Wangxiaopan
14 | * @创建时间:2018/8/24 0024 18:08
15 | * @修改人:
16 | * @修改时间:2018/8/24 0024 18:08
17 | * @修改备注:
18 | */
19 | public class CustomViewGroupActivity extends StatusBarBaseActivity {
20 | public static final String EXTRA_VIEW_TYPE = "extra_view_type";
21 | public static final String EXTRA_VIEW_TYPE_CANVAS = "canvas";
22 | public String type;
23 |
24 | @Override
25 | protected void onCreate(@Nullable Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | LogUtils.d("Test", "onCreate");
28 | type = getIntent().getStringExtra(EXTRA_VIEW_TYPE);
29 | View view = null;
30 | view = new CanvasViewGroup(this);
31 | initView(view);
32 | }
33 |
34 | @Override
35 | protected void onStart() {
36 | super.onStart();
37 | LogUtils.d("Test", "onStart");
38 | }
39 |
40 | @Override
41 | protected void onResume() {
42 | super.onResume();
43 | LogUtils.d("Test", "onResume");
44 | }
45 |
46 | @Override
47 | protected void onPause() {
48 | super.onPause();
49 | LogUtils.d("Test", "onPause");
50 | }
51 |
52 | @Override
53 | protected void onStop() {
54 | super.onStop();
55 | LogUtils.d("Test", "onStop");
56 | }
57 |
58 | @Override
59 | protected void onDestroy() {
60 | super.onDestroy();
61 | LogUtils.d("Test", "onDestroy");
62 | }
63 |
64 |
65 | private void initView(View view) {
66 | setContentView(view);
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewgroup/activity/MyLinearLayout.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewgroup.activity;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.util.Log;
6 | import android.view.animation.AccelerateDecelerateInterpolator;
7 | import android.widget.LinearLayout;
8 | import android.widget.Scroller;
9 |
10 | public class MyLinearLayout extends LinearLayout{
11 |
12 | private Scroller mScroller;
13 |
14 | public MyLinearLayout(Context context) {
15 | super(context);
16 | initScroller(context);
17 | }
18 | public MyLinearLayout(Context context, AttributeSet attrs) {
19 | super(context, attrs);
20 | initScroller(context);
21 | }
22 | public MyLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
23 | super(context, attrs, defStyleAttr);
24 | initScroller(context);
25 | }
26 |
27 | private void initScroller(Context context){
28 | // mScroller = new Scroller(context,new LinearInterpolator());//匀速
29 | // mScroller = new Scroller(context,new AccelerateInterpolator());//加速
30 | // mScroller = new Scroller(context,new DecelerateInterpolator());//减速
31 | mScroller = new Scroller(context, new AccelerateDecelerateInterpolator());//先加速后减速
32 | }
33 |
34 | public void startScroller(int dx,int dy,int duration){
35 | mScroller.startScroll(0, 0, dx, dy, duration);
36 | invalidate();
37 | }
38 |
39 | @Override
40 | public void computeScroll() {
41 | // TODO Auto-generated method stub
42 | Log.d("Test", "MyLinearLayout.computeScroll()");
43 | if (mScroller.computeScrollOffset()) {
44 | // 因为调用computeScroll函数的是MyLinearLayout实例,
45 | // 所以调用scrollTo移动的将是该实例的孩子,也就是MyButton实例
46 | scrollTo(mScroller.getCurrX(), 0);
47 | Log.d("Test", "MyLinearLayout.getCurrX = " + mScroller.getCurrX());
48 | postInvalidate();
49 | }
50 | super.computeScroll();
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewgroup/activity/PathMotionActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewgroup.activity;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.transition.ArcMotion;
7 | import android.transition.ChangeBounds;
8 | import android.transition.TransitionManager;
9 | import android.view.Gravity;
10 | import android.view.View;
11 | import android.widget.Button;
12 | import android.widget.FrameLayout;
13 |
14 | import com.xp.exercise.R;
15 |
16 | /**
17 | * @类描述:路径过度动画
18 | * @创建人:Wangxiaopan
19 | * @创建时间:2018/1/26 0026 11:16
20 | * @修改人:
21 | * @修改时间:2018/1/26 0026 11:16
22 | * @修改备注:
23 | */
24 |
25 | public class PathMotionActivity extends AppCompatActivity implements View.OnClickListener {
26 | private FrameLayout flPathLayout;
27 | private Button btnPathMotion;
28 |
29 | @Override
30 | protected void onCreate(@Nullable Bundle savedInstanceState) {
31 | super.onCreate(savedInstanceState);
32 | setContentView(R.layout.activity_pathmotion);
33 | initViews();
34 | }
35 |
36 | private void initViews() {
37 | flPathLayout = (FrameLayout) findViewById(R.id.fl_pathmotion_layout);
38 | btnPathMotion = (Button) findViewById(R.id.btn_pathmotion_btn);
39 | btnPathMotion.setOnClickListener(this);
40 | }
41 |
42 | @Override
43 | public void onClick(View v) {
44 | switch (v.getId()) {
45 | case R.id.btn_pathmotion_btn:
46 | setPathMotion();
47 | break;
48 | default:
49 | break;
50 | }
51 | }
52 |
53 | private boolean isPath;
54 |
55 | private void setPathMotion() {
56 | ChangeBounds changeBounds = new ChangeBounds();
57 | //或者使用PathMotion 重写Path 调用Path.cubicTo划一个弧度
58 | ArcMotion arcMotion = new ArcMotion();
59 | // arcMotion.setMaximumAngle(90f);
60 | // arcMotion.setMinimumVerticalAngle(90f);
61 | arcMotion.setMinimumHorizontalAngle(90F);
62 | changeBounds.setPathMotion(arcMotion);
63 | changeBounds.setDuration(1000);
64 | TransitionManager.beginDelayedTransition(flPathLayout, changeBounds);
65 | FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) btnPathMotion.getLayoutParams();
66 | params.gravity = isPath ? Gravity.TOP | Gravity.LEFT : Gravity.BOTTOM | Gravity.RIGHT;
67 | btnPathMotion.setLayoutParams(params);
68 | isPath = !isPath;
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewgroup/activity/ScrollerTestActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewgroup.activity;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.FragmentActivity;
5 | import android.view.View;
6 | import android.view.View.OnClickListener;
7 | import android.widget.Button;
8 | import android.widget.Scroller;
9 |
10 | import com.xp.exercise.R;
11 |
12 | public class ScrollerTestActivity extends FragmentActivity implements OnClickListener {
13 |
14 | private MyLinearLayout mLayout1, mLayout2;
15 | private Scroller mScroller;
16 | private Button mButton,mLayoutBtn1,mLayoutBtn2;
17 |
18 | @Override
19 | protected void onCreate(Bundle arg0) {
20 | super.onCreate(arg0);
21 | setContentView(R.layout.activity_scroller);
22 | mButton = (Button) findViewById(R.id.scroller_btn);
23 | mButton.setOnClickListener(this);
24 | mScroller = new Scroller(this);
25 | mLayout1 = (MyLinearLayout) findViewById(R.id.scroller_layout1);
26 | mLayout2 = (MyLinearLayout) findViewById(R.id.scroller_layout2);
27 | mLayoutBtn1 = (Button) findViewById(R.id.scroller_layout_btn1);
28 | mLayoutBtn1.setOnClickListener(this);
29 | mLayoutBtn2 = (Button) findViewById(R.id.scroller_layout_btn2);
30 | mLayoutBtn2.setOnClickListener(this);
31 | }
32 |
33 | @Override
34 | public void onClick(View v) {
35 | switch (v.getId()) {
36 | case R.id.scroller_btn:
37 | // mButton.scrollTo(-50, -50); //执行一次
38 | mButton.scrollBy(-50, 0); // 执行多次
39 | break;
40 |
41 | case R.id.scroller_layout_btn1:
42 | mLayout1.startScroller(-600,0,1000);
43 | break;
44 | case R.id.scroller_layout_btn2:
45 | mLayout2.startScroller(-800,0,1500);
46 | break;
47 | }
48 |
49 | }
50 |
51 | }
52 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewgroup/activity/SwitchActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewgroup.activity;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.transition.Fade;
7 | import android.transition.Slide;
8 | import android.transition.TransitionManager;
9 | import android.transition.TransitionSet;
10 | import android.view.Gravity;
11 | import android.view.View;
12 | import android.widget.LinearLayout;
13 | import android.widget.TextView;
14 |
15 | import com.xp.exercise.R;
16 |
17 | /**
18 | * @类描述:两个activity过度
19 | * @创建人:Wangxiaopan
20 | * @创建时间:2018/1/24 0024 18:12
21 | * @修改人:
22 | * @修改时间:2018/1/24 0024 18:12
23 | * @修改备注:
24 | */
25 |
26 | public class SwitchActivity extends AppCompatActivity implements View.OnClickListener {
27 | private LinearLayout llParentLayout;
28 | private TextView tvFirst, tvSecond;
29 |
30 | @Override
31 | protected void onCreate(@Nullable Bundle savedInstanceState) {
32 | super.onCreate(savedInstanceState);
33 | setContentView(R.layout.activity_switch);
34 | initViews();
35 | }
36 |
37 | private void initViews() {
38 | llParentLayout = (LinearLayout) findViewById(R.id.ll_parent_layout);
39 | findViewById(R.id.btn_switch_anim).setOnClickListener(this);
40 | tvFirst = (TextView) findViewById(R.id.iv_switch_meinv);
41 | tvSecond = (TextView) findViewById(R.id.iv_switch_second);
42 | }
43 |
44 | @Override
45 | public void onClick(View v) {
46 | switch (v.getId()) {
47 | case R.id.btn_switch_anim:
48 | switchAnim();
49 | break;
50 | default:
51 | break;
52 | }
53 | }
54 |
55 | private void switchAnim() {
56 | Slide slide = new Slide(Gravity.RIGHT);
57 | slide.excludeTarget(tvFirst, true);
58 | Fade fade = new Fade();
59 | fade.excludeTarget(tvSecond, true);
60 | TransitionSet transitionSet = new TransitionSet()
61 | .addTransition(slide)
62 | .addTransition(fade);
63 | TransitionManager.beginDelayedTransition(llParentLayout, transitionSet);
64 | if (tvFirst.getVisibility() == View.VISIBLE) {
65 | tvFirst.setVisibility(View.GONE);
66 | tvSecond.setVisibility(View.GONE);
67 | } else {
68 | tvFirst.setVisibility(View.VISIBLE);
69 | tvSecond.setVisibility(View.VISIBLE);
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewgroup/view/CanvasViewGroup.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewgroup.view;
2 |
3 | import android.content.Context;
4 | import android.graphics.Bitmap;
5 | import android.graphics.BitmapFactory;
6 | import android.graphics.Canvas;
7 | import android.graphics.Matrix;
8 | import android.graphics.Paint;
9 | import android.graphics.Path;
10 | import android.graphics.RectF;
11 | import android.util.AttributeSet;
12 | import android.view.View;
13 | import android.view.ViewGroup;
14 |
15 | import com.xp.exercise.R;
16 | import com.xp.exercise.util.LogUtils;
17 |
18 | /**
19 | * @类描述:应用常量类
20 | * @创建人:Wangxiaopan
21 | * @创建时间:2018/8/24 0024 18:06
22 | * @修改人:
23 | * @修改时间:2018/8/24 0024 18:06
24 | * @修改备注:
25 | */
26 | public class CanvasViewGroup extends ViewGroup {
27 | public CanvasViewGroup(Context context) {
28 | super(context);
29 | //默认ViewGroup下的onDraw是不走的。
30 | //下面两个方法中的任何一个 都会使ViewGroup走onDraw方法。m
31 | setWillNotDraw(false);
32 | setBackgroundColor(getResources().getColor(R.color.red));
33 | }
34 |
35 | public CanvasViewGroup(Context context, AttributeSet attrs) {
36 | super(context, attrs);
37 | }
38 |
39 | public CanvasViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
40 | super(context, attrs, defStyleAttr);
41 | }
42 |
43 | @Override
44 | protected void onDraw(Canvas canvas) {
45 | LogUtils.d("Test", "onDraw");
46 | drawCircleImage(canvas);
47 | super.onDraw(canvas);
48 | }
49 |
50 | @Override
51 | public void draw(Canvas canvas) {
52 | LogUtils.d("Test", "draw");
53 | // drawCircleImage(canvas);
54 | super.draw(canvas);
55 | }
56 |
57 | @Override
58 | protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
59 | LogUtils.d("Test", "drawChild");
60 | drawCircleImage(canvas);
61 | return super.drawChild(canvas, child, drawingTime);
62 | }
63 |
64 | @Override
65 | protected void onLayout(boolean changed, int l, int t, int r, int b) {
66 | LogUtils.d("Test", "onLayout");
67 |
68 | }
69 |
70 | @Override
71 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
72 | LogUtils.d("Test", "onMeasure");
73 | super.onMeasure(widthMeasureSpec, heightMeasureSpec);
74 | }
75 |
76 | private Canvas drawCircleImage(Canvas canvas) {
77 | Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_mine_head).copy(Bitmap.Config.ARGB_8888, true);
78 | canvas.drawBitmap(bitmap, new Matrix(), new Paint());
79 | int bitmapWidth = bitmap.getWidth();
80 | int bitmapHeight = bitmap.getHeight();
81 | canvas.save();
82 | Path clipPath = new Path();
83 | RectF clipRect = new RectF(0, 0, bitmapHeight, bitmapHeight);
84 | clipPath.addOval(clipRect, Path.Direction.CW);
85 | // clipPath.addCircle(bitmapWidth/2, bitmapHeight/2, bitmapHeight/2, Direction.CW);
86 | canvas.clipPath(clipPath);
87 | // canvas.clipRect(clipRect);
88 | canvas.drawBitmap(bitmap, null, clipRect, new Paint());
89 | return canvas;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/app/src/main/java/com/xp/exercise/viewpager/IndicatorViewPagerActivity.java:
--------------------------------------------------------------------------------
1 | package com.xp.exercise.viewpager;
2 |
3 | import android.os.Bundle;
4 |
5 | import com.xp.exercise.canvas.widget.BezierRoundIndicatorView;
6 | import com.xp.exercise.statsbar.base.CompatStatusBarActivity;
7 |
8 | /**
9 | * @类描述:应用常量类
10 | * @创建人:Wangxiaopan
11 | * @创建时间:2018/10/10 0010 17:40
12 | * @修改人:
13 | * @修改时间:2018/10/10 0010 17:40
14 | * @修改备注:
15 | */
16 | public class IndicatorViewPagerActivity extends CompatStatusBarActivity {
17 | @Override
18 | protected void onCreate(Bundle savedInstanceState) {
19 | super.onCreate(savedInstanceState);
20 | BezierRoundIndicatorView view = new BezierRoundIndicatorView(this);
21 | setContentView(view);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/activity_close_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/activity_close_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
13 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/activity_open_enter.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
13 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/activity_open_exit.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/activity_right_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/activity_right_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/fade_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/fade_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/listview_animation.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/push_left_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/push_left_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/push_right_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/push_right_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/radar_image_scale.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/radar_search_animation.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/background_mine_head.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/background_mine_head.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/explode1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/explode1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/explode2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/explode2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/explode3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/explode3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/explode4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/explode4.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/explode5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/explode5.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_mike_bg_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/ic_mike_bg_1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_mike_bg_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/ic_mike_bg_2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_mike_bg_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/ic_mike_bg_3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_mike_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/ic_mike_black.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_mike_gray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/ic_mike_gray.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_search_cricle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/ic_search_cricle.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/icon_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/icon_1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/icon_arraw_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/icon_arraw_back.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/icon_arraw_bottom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/icon_arraw_bottom.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/icon_arraw_right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/icon_arraw_right.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/icon_arraw_top.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/icon_arraw_top.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_001.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_001.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_002.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_002.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_003.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_003.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_004.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_004.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_005.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_005.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_006.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_006.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_007.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_007.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_008.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_008.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_009.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_009.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_011.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_011.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_012.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_012.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_013.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/img_013.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/radar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/radar.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/radar_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/radar_bg.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/speech_close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/speech_close.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/speech_line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/speech_line.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/speech_mic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/speech_mic.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/speech_mic_circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/speech_mic_circle.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/speech_mic_disable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xhdpi/speech_mic_disable.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/icon_arraw_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/icon_arraw_back.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/icon_back_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/icon_back_white.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/icon_cftx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/icon_cftx.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/icon_more_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/icon_more_white.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/icon_red_start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/icon_red_start.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/meinv_large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/meinv_large.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/meinv_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/meinv_small.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/qrcode.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/drawable-xxhdpi/qrcode.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_blue_red_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_ripple_blue.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_white_gray_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_bottom_sheet.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
20 |
21 |
26 |
27 |
28 |
29 |
30 |
31 |
40 |
41 |
47 |
48 |
54 |
55 |
56 |
64 |
65 |
72 |
73 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_circle_wave.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_collpasing_snap_toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
17 |
18 |
26 |
27 |
28 |
29 |
34 |
35 |
41 |
42 |
47 |
48 |
49 |
50 |
51 |
52 |
60 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_collpasing_toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
20 |
21 |
29 |
30 |
35 |
36 |
37 |
38 |
43 |
44 |
50 |
51 |
56 |
57 |
58 |
59 |
60 |
61 |
67 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_compass.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_compat_status_bar.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_coordinator_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
21 |
22 |
23 |
28 |
29 |
35 |
36 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_fragment_statusbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
17 |
18 |
24 |
25 |
31 |
32 |
38 |
39 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_fullscreen_havastatus.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_lesson_five.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_lesson_four.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
13 |
14 |
22 |
23 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_lesson_one.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_lesson_three.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
11 |
12 |
16 |
17 |
24 |
25 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_lesson_two.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
12 |
13 |
18 |
19 |
20 |
27 |
28 |
34 |
35 |
40 |
41 |
42 |
47 |
48 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_my_behavior.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
18 |
19 |
20 |
25 |
26 |
32 |
33 |
38 |
39 |
40 |
41 |
42 |
43 |
51 |
52 |
59 |
60 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_pathmotion.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_pull_to_change.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_radar_search.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_scroller.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
20 |
21 |
26 |
27 |
28 |
34 |
35 |
40 |
41 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_slow_scroll.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_speed.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
17 |
18 |
23 |
24 |
25 |
30 |
31 |
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_statusbar_text.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
22 |
23 |
24 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_statusbar_text2.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
21 |
22 |
23 |
30 |
31 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_switch.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
22 |
23 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_view_draghelper_main.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
13 |
14 |
22 |
23 |
31 |
32 |
40 |
41 |
49 |
50 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_visible_invisible.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
20 |
21 |
26 |
27 |
34 |
35 |
36 |
37 |
45 |
46 |
50 |
51 |
58 |
59 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_welcome.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
12 |
18 |
24 |
30 |
36 |
42 |
50 |
51 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_title_change.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
21 |
22 |
23 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/include_title_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
19 |
20 |
25 |
26 |
27 |
33 |
34 |
40 |
41 |
42 |
47 |
48 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/include_toolbar_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_img.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
13 |
14 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_listview_text.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_main_elv_child.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
15 |
16 |
24 |
25 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_main_elv_parent.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
18 |
19 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_touch_recycler.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/layout_lesson5_item.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
10 |
11 |
16 |
17 |
18 |
19 |
27 |
28 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/layout_list_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/line_circle_translate_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
18 |
19 |
25 |
26 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/listview_header_image.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ontouch_activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
16 |
17 |
26 |
27 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ontouch_activity_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
19 |
20 |
28 |
29 |
36 |
37 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ontouch_activity_recyclerview.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ontouch_activity_scrollview.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
16 |
17 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/textview_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/view_radar_search.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
12 |
13 |
19 |
20 |
26 |
27 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/viewdrag_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/transition/activity_switch_explode.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/transition/activity_switch_slide.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/transition/trans_bounds.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v11/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v14/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 | #FFbaa071
7 | #FFFF7A03
8 | #F10C0C
9 | #000
10 | #702216
11 | #323232
12 | #8B8B8B
13 | #fff
14 | #f00
15 | #237EAD
16 |
17 | #15A8EB
18 | #CCCCCC
19 | #E6E6E6
20 |
21 | #18191a
22 | #4D4B4B
23 | #807E7D
24 | #B3B0AF
25 | #3399ff
26 | #13C083
27 | #FF7733
28 | #DE0108
29 | #369EE1
30 |
31 | #F5F5F5
32 | #F5F5F5
33 | #3399ff
34 | #3399ff
35 | #13C083
36 | #FF7733
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 2px
4 | 6.5dp
5 | 60dp
6 | 4dp
7 | 120dp
8 | 32dp
9 | 49dp
10 | 10dp
11 | 10dp
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | MyExercise
5 | Hello world!
6 |
7 | Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,
8 | 由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。
9 | Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,
10 | Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。
11 | 随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。
12 | Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,
13 | Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。
14 | [1] 2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。
15 | 2003年10月,Andy Rubin等人创建Android公司,并组建Android团队。
16 | 2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队。安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目。
17 | 2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与84家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟(Open Handset Alliance)来共同研发改良Android系统,这一联盟将支持谷歌发布的手机操作系统以及应用软件,Google以Apache免费开源许可证的授权方式,发布了Android的源代码。[4-5]
18 | 2008年,在GoogleI/O大会上,谷歌提出了AndroidHAL架构图,在同年8月18号,Android获得了美国联邦通信委员会(FCC)的批准,在2008年9月,谷歌正式发布了Android 1.0系统,这也是Android系统最早的版本。
19 | 2009年4月,谷歌正式推出了Android 1.5这款手机,从Android 1.5版本开始,谷歌开始将Android的版本以甜品的名字命名,Android 1.5命名为Cupcake(纸杯蛋糕)。该系统与Android 1.0相比有了很大的改进。
20 | 2009年9月份,谷歌发布了Android 1.6的正式版,并且推出了搭载Android 1.6正式版的手机HTC Hero(G3),凭借着出色的外观设计以及全新的Android 1.6操作系统,HTC Hero(G3)成为当时全球最受欢迎的手机。Android 1.6也有一个有趣的甜品名称,它被称为Donut(甜甜圈)。
21 | 2010年2月份,Linux内核开发者Greg Kroah-Hartman将Android的驱动程序从Linux内核“状态树”(“staging tree”)上除去,从此,Android与Linux开发主流将分道扬镳。在同年5月份,谷歌正式发布了Android 2.2操作系统。谷歌将Android 2.2操作系统命名为Froyo,翻译完名为冻酸奶。
22 | 2010年10月份,谷歌宣布Android系统达到了第一个里程碑,即电子市场上获得官方数字认证的Android应用数量已经达到了10万个,Android系统的应用增长非常迅速。在2010年12月,谷歌正式发布了Android 2.3操作系统Gingerbread (姜饼)。
23 | 2011年1月,谷歌称每日的Android设备新用户数量达到了30万部,到2011年7月,这个数字增长到55万部,而Android系统设备的用户总数达到了1.35亿,Android系统已经成为智能手机领域占有量最高的系统。
24 | 2011年8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian(塞班系统)的霸主地位,跃居全球第一。
25 | 2011年9月份,Android系统的应用数目已经达到了48万,而在智能手机市场,Android系统的占有率已经达到了43%。继续在排在移动操作系统首位。谷歌将会发布全新的Android 4.0操作系统,这款系统被谷歌命名为Ice Cream Sandwich(冰激凌三明治)。
26 | 2012年1月6日,谷歌Android Market已有10万开发者推出超过40万活跃的应用,大多数的应用程序为免费。Android Market应用程序商店目录在新年首周周末突破40万基准,距离突破30万应用仅4个月。在2011年早些时候,Android Market从20万增加到30万应用也花了四个月。[6]
27 | 2013年11月1日,Android4.4正式发布,从具体功能上讲,Android4.4提供了各种实用小功能,新的Android系统更智能,添加更多的Emoji表情图案,UI的改进也更现代,如全新的HelloiOS7半透明效果。
28 | 2015年27日,网络安全公司Zimperium研究人员警告,安卓(Android)存在“致命”安全漏洞,黑客发送一封彩信便能在用户毫不知情的情况下完全控制手机。
29 |
30 |
31 | http://blog.csdn.net/wangxp423
32 | https://github.com/wangxp423
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
14 |
15 |
16 |
17 |
18 |
19 |
22 |
23 |
25 |
26 |
40 |
41 |
42 |
55 |
56 |
57 |
62 |
63 |
64 |
70 |
71 |
72 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | google()
7 | mavenCentral()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:4.0.2'
11 |
12 | // NOTE: Do not place your application dependencies here; they belong
13 | // in the individual module build.gradle files
14 | }
15 | }
16 |
17 | allprojects {
18 | repositories {
19 | jcenter()
20 | google()
21 | mavenCentral()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Apr 04 17:34:25 CST 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/screenshot/721146199.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/721146199.png
--------------------------------------------------------------------------------
/screenshot/draw/canvas_bezier.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/canvas_bezier.jpg
--------------------------------------------------------------------------------
/screenshot/draw/canvas_canvas.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/canvas_canvas.jpg
--------------------------------------------------------------------------------
/screenshot/draw/canvas_demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/canvas_demo.gif
--------------------------------------------------------------------------------
/screenshot/draw/canvas_drag_red.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/canvas_drag_red.gif
--------------------------------------------------------------------------------
/screenshot/draw/canvas_wave.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/canvas_wave.gif
--------------------------------------------------------------------------------
/screenshot/draw/main_canvas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/main_canvas.png
--------------------------------------------------------------------------------
/screenshot/draw/mi_shizhong.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/mi_shizhong.gif
--------------------------------------------------------------------------------
/screenshot/draw/secoo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/secoo.gif
--------------------------------------------------------------------------------
/screenshot/draw/tantan_search.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/tantan_search.gif
--------------------------------------------------------------------------------
/screenshot/draw/water_wave.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/water_wave.gif
--------------------------------------------------------------------------------
/screenshot/draw/zhinanzhen.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/draw/zhinanzhen.gif
--------------------------------------------------------------------------------
/screenshot/listview/secoo_list_move.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/listview/secoo_list_move.gif
--------------------------------------------------------------------------------
/screenshot/main_function.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/main_function.png
--------------------------------------------------------------------------------
/screenshot/plugin_mine-debug.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/plugin_mine-debug.apk
--------------------------------------------------------------------------------
/screenshot/plugin_order-debug.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/plugin_order-debug.apk
--------------------------------------------------------------------------------
/screenshot/qrcode.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/qrcode.jpg
--------------------------------------------------------------------------------
/screenshot/statusbar/statusbar_fragment.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/statusbar/statusbar_fragment.jpg
--------------------------------------------------------------------------------
/screenshot/statusbar/statusbar_main.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/statusbar/statusbar_main.png
--------------------------------------------------------------------------------
/screenshot/toolbar/bottomsheet_behavior_baidu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/toolbar/bottomsheet_behavior_baidu.gif
--------------------------------------------------------------------------------
/screenshot/toolbar/custom_behavior_collaps.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/toolbar/custom_behavior_collaps.gif
--------------------------------------------------------------------------------
/screenshot/toolbar/custom_behavior_zhihu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/toolbar/custom_behavior_zhihu.gif
--------------------------------------------------------------------------------
/screenshot/toolbar/toolbar_collaps_collaps.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/toolbar/toolbar_collaps_collaps.gif
--------------------------------------------------------------------------------
/screenshot/toolbar/toolbar_main.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/toolbar/toolbar_main.png
--------------------------------------------------------------------------------
/screenshot/toolbar/toolbar_normal_collaps.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/toolbar/toolbar_normal_collaps.gif
--------------------------------------------------------------------------------
/screenshot/touch/touch_main.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangxp423/ViewExercise/fd2c412a36ba48fcf099c81c370e3b9b2db6f06d/screenshot/touch/touch_main.jpg
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------