学习记录6
Android Studio 第 6 天学习记录
一、学习内容
(一)事件处理机制的深入学习
• 事件传递机制
• 学习了Android中事件传递的三个核心方法:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。理解了它们在事件传递过程中的调用顺序和作用:
• dispatchTouchEvent:事件分发方法,用于决定事件是自己处理还是向下传递给子控件。
• onInterceptTouchEvent:仅在ViewGroup(如LinearLayout、RelativeLayout等)中有效,用于拦截事件,决定事件是否继续传递给子控件。
• onTouchEvent:事件处理方法,用于处理事件的具体逻辑。
• 通过代码示例,实践了如何通过重写这些方法来实现自定义的事件处理逻辑。例如,实现一个自定义的滑动删除效果,通过拦截和处理触摸事件来控制视图的滑动和隐藏。
• 多点触控事件
• 了解了多点触控事件的基本概念,学习了如何通过MotionEvent获取多点触控的坐标和动作。例如,通过MotionEvent.getActionIndex获取触控点的索引,通过MotionEvent.getX和MotionEvent.getY获取特定触控点的坐标。
• 实践了一个简单的多点触控示例,绘制两个手指触摸屏幕时的连线,并根据手指的移动动态更新连线的位置。
(二)自定义控件
• 自定义 View 的基本步骤
• 学习了自定义 View 的基本流程:
• 继承 View 类:创建一个自定义 View 类,继承自android.view.View。
• 构造方法:实现三个构造方法:MyView(Context context)、MyView(Context context, AttributeSet attrs)和MyView(Context context, AttributeSet attrs, int defStyleAttr),以支持代码创建、XML布局文件创建和自定义样式。
• 测量尺寸:重写onMeasure方法,自定义控件的尺寸测量逻辑。例如,根据内容动态计算控件的宽高。
• 绘制逻辑:重写onDraw方法,使用Canvas和Paint类绘制自定义的图形或文本。
• 实践了一个简单的自定义圆形进度条控件。通过onDraw方法绘制一个圆形背景和一个动态变化的弧形进度条,并通过invalidate方法触发重绘以更新进度。
• 自定义属性
• 学习了如何在res/values/attrs.xml中定义自定义属性,并在自定义 View 中使用这些属性。例如,为圆形进度条定义了进度颜色、背景颜色和最大进度等属性。
• 在布局文件中通过app:custom_attribute的方式使用这些自定义属性,实现了自定义控件的灵活配置。
(三)Fragment 的使用
• Fragment 的生命周期
• 学习了 Fragment 的生命周期方法,包括onAttach、onCreate、onCreateView、onActivityCreated、onStart、onResume、onPause、onStop、onDestroyView、onDestroy和onDetach等。
• 理解了 Fragment 生命周期与 Activity 生命周期的关系,以及 Fragment 在不同状态下的行为。
• Fragment 的添加与替换
• 学会了通过代码动态添加和替换 Fragment 的方法。使用FragmentManager和FragmentTransaction来管理 Fragment 的事务,例如:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, new MyFragment());
fragmentTransaction.commit();
```
• 实践了一个包含两个 Fragment 的应用,通过按钮点击切换 Fragment 的显示内容。
二、实践操作
(一)自定义控件的开发
• 自定义圆形进度条控件
• 创建了一个自定义的圆形进度条控件类`CircularProgressBar`,继承自`View`。
• 在`onMeasure`方法中,根据父布局的尺寸和自定义属性动态计算控件的宽高。
• 在`onDraw`方法中,使用`Canvas`绘制圆形背景和弧形进度条。通过`Paint`设置颜色和样式,根据进度值动态绘制弧形。
• 在布局文件中使用该自定义控件,并通过自定义属性设置进度颜色和最大进度值。
• 在代码中通过调用`setProgress`方法动态更新进度条的值,并通过`invalidate`触发重绘。
• 多点触控绘图应用
• 创建了一个简单的绘图应用,支持多点触控绘制线条。
• 在`onTouchEvent`方法中,通过`MotionEvent`获取触摸点的坐标和动作类型(如按下、移动、抬起)。
• 使用`Canvas`和`Paint`动态绘制线条,并根据触摸点的移动实时更新线条的位置。
(二)Fragment 的动态管理
• 动态切换 Fragment
• 创建了一个包含两个 Fragment 的应用,分别命名为`FragmentOne`和`FragmentTwo`。
• 在主 Activity 中定义了一个`FrameLayout`作为 Fragment 的容器。
• 通过按钮点击事件,使用`FragmentManager`和`FragmentTransaction`动态替换 Fragment 的内容。
• 在 Fragment 中设置了一些简单的 UI 元素(如`TextView`),并通过`onCreateView`方法初始化视图。
三、遇到的问题及解决方法
(一)问题:自定义 View 的`onMeasure`方法中尺寸计算错误
• 原因:在`onMeasure`方法中,没有正确处理父布局的约束和自定义属性的尺寸计算逻辑,导致自定义 View 的尺寸不符合预期。
• 解决方法:仔细分析父布局的尺寸约束(如宽高模式为`EXACTLY`、`AT_MOST`或`UNSPECIFIED`),并根据自定义属性(如最大宽度、最大高度)动态计算控件的宽高。通过调用`setMeasuredDimension`方法设置最终的尺寸。
(二)问题:Fragment 替换后,之前的 Fragment 数据未正确保存
• 原因:在 Fragment 替换时,没有正确处理 Fragment 的保存和恢复逻辑,导致数据丢失。
• 解决方法:在 Fragment 中重写`onSaveInstanceState`方法,保存关键数据。在`onCreateView`或`onActivityCreated`方法中,通过`savedInstanceState`恢复数据。同时,确保在 Fragment 替换时,使用`addToBackStack`方法将 Fragment 事务添加到回退栈中,以便用户可以通过返回键恢复之前的 Fragment。
四、总结与展望
今天的学习重点是事件处理机制、自定义控件和 Fragment 的使用。通过理论学习和实践操作,我对这些知识点有了更深入的理解,并能够实现一些简单的自定义控件和 Fragment 动态管理功能。在学习过程中,虽然遇到了一些问题,但通过分析和解决这些问题,进一步巩固了知识。
接下来,我计划继续深入学习自定义控件的高级特性,如自定义动画和交互效果。同时,开始学习 Android 的网络请求和数据存储机制,为开发更复杂的应用功能打下基础。

浙公网安备 33010602011771号