├── .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 |