Android36_样式主题与自定义View

时间:2022-08-30 07:59:14
样式主题和自定义View

样式和主题资源都是用于对Android应用进行美化的。
一、样式: (一)、介绍: 1、概念:Android中的样式和CSS样式作用相似,都是用于为界面元素定义显示风格,它是包含一个或者多个view控件属性的集合。如:需要定义字体的颜色和大小。 2、作用:将一些常用的属性组合成样式,便于重复使用,减少给View控件指定类似属性的重复工作。 Android Style类似网页设计中的级联样式CSS设计思路,可以让设计与内容分离,并且可以方便的继承、覆盖、重用。
(二)、用法: 1、存储位置:res/values目录下
2、写法:
  • 以<recources>为根标签
  • 二级节点为<style>标签: 其中包含name属性和parent属性。
    • name:指定样式的名称;
    • parent:指定该样式所继承的父级样式。当继承于某个父样式,那么该样式就获得父样式定义的全部格式。当然,当前样式也可以覆盖父样式的格式。
  • 三级节点为<item>标签
    • name: 该属性值标准的控件属性的格式;
    • item的文本值为该属性所对应的值。

<resources> <style name=“itcast”> <!-- 为样式定义一个全局唯一的名字-->  <item name="android:textSize">18px</item> <!-- name属性为样式要用在的View控件持有的属性 -->  <item name="android:textColor">#0000CC</item> </style></resources>

<?xml version="1.0" encoding="utf-8"?>
<resources>
<stylename="mystyle1"parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
</resources>

3、如何调用资源:<TextView    android:id="@+id/textView1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="TextView"    style="@style/mystyle1"/>
4、样式的继承:

有两种方式来实现继承:一是通过style的parent属性,二是使用类似CSS中的命名规则来实现。


A、通过style的parent属性继承: <resources>     <style name="mystyle1">         <item name="android:layout_width">wrap_content</item>         <item name="android:layout_height">wrap_content</item>     </style>           <style name="mystyle2" parent="mystyle1">         <item name="android:textColor">#00FF00</item>     </style> </resources>

B、通过style的命名规则继承: ①继承并修改:
<stylename="CodeFont.Red">
<item name="android:textColor">#FF0000</item>
</style>
②继承并增加属性
<stylename="CodeFont.Red.Big">
<item name="android:textSize">30sp</item>
</style>
③引入系统style
parent="@android:style/TextAppearance.Medium"

通过“.”号实现继承。 引用方式:style="@style/CodeFont.Red.Big"

二、主题: (一)、概念: 1、主题和样式资源非常相似。也是放res/values目录下,也是以resourses作为根节点,style作为二级节点,item作为三级节点。属性设置也相似。
2、尽管在定义上,样式和主题基本相同,但是它们使用的地方不同。两者区别在于:
  • 主题通过AndroidManifest.xml中的<application>和<activity>用在整个应用或者某个 Activity,主题对整个应用或某个Activity存在全局性影响。而样式都写在Activity的布局中,用在单独的View,如:EditText、TextView等;
  • 主题定义的格式应该是改变窗口外观的格式:例如窗口标题、窗口边框等等。
  • 如果一个应用使用了主题,同时应用下的view也使用了样式,那么当主题与样式属性发生冲突时,样式的优先级高于主题。(也就是谁最靠近UI控件,谁起作用) 

【备注:】 Android系统也定义了一些主题,例如: <activity android:theme=“@android:style/Theme.Dialog”>, 该主题可以让Activity看起来像一个对话框,如果需要查阅这些主题,可以在文档的reference-->android-->R.style 中查看。 其它自带的主题样式。例如Theme.Translucent等等。
(二)、用法: 1、自定义Activity主题
<style name="MyTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullScreen">true</item>
    <item name="android:windowBackground">@drawable/star</item>
</style>

①在styles.xml中添加主题
<colorname="custom_theme_color">#b0b0ff</color>
<stylename="CustomTheme"parent="android:Theme.Light">
<item name="android:windowBackground">@color/custom_theme_color</item>
<item name="android:colorBackground">@color/custom_theme_color</item>
</style>
②在AndroidManifest.xml中引用主题
<activityandroid:theme="@style/CustomTheme">
2.使用系统的主题
<activityandroid:theme="@android:style/Theme.Translucent">

【备注:】         Android平台提供了一大堆样式和主题,你完全可以在你的应用程序中使用。你可以在R.style class中找到一份关于所有可使用的样式参考。要使用所有在这份参考中列出的样式,你需要将样式name的下划线换成点号。比如,你可以通过”@android:style/Theme.NoTitleBar“来使用这里列出的Theme_NoTitleBar主题。

三、Android设置横屏或竖屏 (一)、全屏: 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 :
  • requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题 
  • getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏 

(二)、横屏: 1、做法1:修改Activity的onResume(): @Override protected void onResume() {
 // 设置为横屏  if(getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 }  super.onResume();
}
2、做法2:在配置文件中对Activity节点添加android:screenOrientation属性(landscape是横向,portrait是纵向) android:launchMode="singleTask" android:screenOrientation="portrait">
3、判断此时屏幕是横屏还是竖屏的方法: if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      //横屏 } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      //竖屏 }
(三)、竖屏:         要设置成竖屏设置成 SCREEN_ORIENTATION_PORTRAIT

四、自定义View         按类型划分,自定义View的实现方式可分为三种:自绘控件组合控件、以及继承控件         如何让自定义的View在界面上显示出来? 只需要像使用普通的控件一样来使用自定义View就可以了。
 Android系统中要自定义view,首先需要了解Android的view加载机制。主要有三个方法:
1、onMeasure()     //计算出view自身大小
2、onLayout()     //仅在ViewGroup中,用来为子view指定位置(left,top)
3、onDraw()      /View绘制内容


(一)、自绘控件: 1、概念:自绘控件的意思就是,这个View上所展现的内容全部都是自己绘制出来的。 2、自绘控件的步骤:
  • 1、绘制View :
    • 绘制View主要是onDraw()方法中完成。通过参数Canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等等。
    • Canvas绘制的常用方法:
      1. drawColor()    填充颜色
      2. drawLine()     绘制线
      3. drawLines()   绘制线条
      4. drawOval()    绘制圆
      5. drawPaint()     
      6. drawPath()      绘制路径
      7. drawPicture()     绘制图片
      8. drawPoint()     绘制点
      9. drawPoints()    绘制点
      10. drawRGB()    填充颜色
      11. drawRect()     绘制矩形
      12. drawText()     绘制文本
      13. drawTextOnPath()    在路径上绘制文本
  • 2、刷新View :(刷新view的方法这里主要有:) 
    • invalidate(int l,int t,int r,int b)     
      • 刷新局部,四个参数分别为左、上、右、下 
    •  invalidate()                                          
      • 整个view刷新。执行invalidate类的方法将会设置view为无效,最终重新调用onDraw()方法。
      • invalidate()是用来刷新View的,必须是在UI线程中进行工作。在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。
    • invalidate(Rect dirty)                           
      • 刷新一个矩形区域
  • 3、控制事件:(例如处理以下几个事件)
    • onSaveInstanceState() 处理屏幕切换的现场保存事件 
    • onRestoreInstanceState() 屏幕切换的现场还原事件 
    • onKeyDown() 处理按键事件
    • onMeasure()  当控件的父元素正要放置该控件时调用


3、案例核心代码:


(二)、组合控件 1、概念:               组合控件的意思就是,不需要自己去绘制视图上显示的内容,而只是用系统原生的控件就好了,但可以将几个系统原生的控件组合到一起,这样创建出的控件就被称为组合控件。
2、例如:标题栏就是个很常见的组合控件,很多界面的头部都会放置一个标题栏,标题栏上会有个返回按钮和标题,点击按钮后就可以返回到上一个界面。那么下面我们就来尝试去实现这样一个标题栏控件。
3、案例核心代码——实现图片右上角显示红色圆圈,圈内显示数字



(三)、继承控件: 1、概念:               继承控件的意思就是,我们并不需要自己重头去实现一个控件,只需要去继承一个现有的控件,然后在这个控件上增加一些新的功能,就可以形成一个自定义的控件了。         这种自定义控件的特点就是不仅能够按照我们的需求加入相应的功能,还可以保留原生控件的所有功能,比如 Android PowerImageView实现,可以播放动画的强大ImageView 就是一个典型的继承控件。
2、例如:对ListView进行扩展, 加入在ListView上滑动就可以显示出一个删除按钮,点击按钮就会删除相应数据的功能。
3、核心代码——实现ListView的item手势侧滑,显示删除按钮