最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義控件之基本原理(一)

 更新時間:2016年07月27日 10:23:29   作者:總李寫代碼  
這篇文章主要介紹了Android自定義控件之基本原理(一)的相關資料,需要的朋友可以參考下

前言:

在日常的Android開發(fā)中會經(jīng)常和控件打交道,有時Android提供的控件未必能滿足業(yè)務的需求,這個時候就需要我們實現(xiàn)自定義一些控件,今天先大致了解一下自定義控件的要求和實現(xiàn)的基本原理。

自定義控件要求:

1. 應當遵守Android標準的規(guī)范(命名,可配置,事件處理等)。

2. 在XML布局中科配置控件的屬性。

3. 對交互應當有合適的反饋,比如按下,點擊等。

4. 具有兼容性, Android版本很多,應該具有廣泛的適用性。

自定義控件學習步驟:

  1 .View的工作原理

  2 .編寫View類

  3.為View類增加屬性

  4 .繪制屏幕

  5. 響應用戶消息

  6 .自定義回調(diào)函數(shù)

自定義控件兩種方式:

  1. 繼承ViewGroup

例如:ViewGroup、LinearLayout、FrameLayout、RelativeLayout等。

  2. 繼承View

例如:View、TextView、ImageView、Button等。

自定義控件基本繪制原理:

View的繪制基本上由measure()、layout()、draw()這個三個函數(shù)完成

1.)測量-Measure過程是計算視圖大小,View measure過程相關方法主要有三個:

public final void measure(int widthMeasureSpec, int heightMeasureSpec) 
protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

measure調(diào)用onMeasure,onMeasure測量寬度、高度然后調(diào)用setMeasureDimension保存測量結(jié)果,measure,setMeasureDimension是final類型,view的子類不需要重寫,onMeasure在view的子類中重寫。

關于MeasureSpec:

(1)UPSPECIFIED :父容器對于子容器沒有任何限制,子容器想要多大就多大.

(2) EXACTLY父容器已經(jīng)為子容器設置了尺寸,子容器應當服從這些邊界,不論子容器想要多大的空間.

(3) AT_MOST子容器可以是聲明大小內(nèi)的任意大小.

2.)布局-Layout過程用于設置視圖在屏幕中顯示的位置,View layout過程相關方法主要要三個:

public void layout(int l, int t, int r, int b)
protected boolean setFrame(int left, int top, int right, int bottom)
protected void onLayout(boolean changed, int left, int top, int right, int bottom)

layout通過調(diào)用setFrame(l,t,r,b),l,t,r,b即子視圖在父視圖中的具體位置,onLayout一般只會在自定義ViewGroup中才會使用

3.)繪制-draw過程主要用于利用前兩步得到的參數(shù),將視圖顯示在屏幕上,到這里也就完成了整個的視圖繪制工作。

public void draw(Canvas canvas)
protected void onDraw(Canvas canvas)

通過調(diào)用draw函數(shù)進行視圖繪制,在View類中onDraw函數(shù)是個空函數(shù),最終的繪制需求需要在自定義的onDraw函數(shù)中進行實現(xiàn),比如ImageView完成圖片的繪制,如果自定義ViewGroup這個函數(shù)則不需要重載。

自定義控件示例:

這里先介紹繼承View的方式為例,其實ViewGroup最終的繼承的也是View。這里 模擬一個需求場景,需要一個圓形顯示百分比。

public class PercentView extends View {
private final static String TAG = PercentView.class.getSimpleName();
private Paint mPaint;
public PercentView(Context context) {
super(context);
}
public PercentView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PercentView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
Log.e(TAG, "onMeasure--widthMode-->" + widthMode);
switch (widthMode) {
case MeasureSpec.EXACTLY:
break;
case MeasureSpec.AT_MOST:
break;
case MeasureSpec.UNSPECIFIED:
break;
}
Log.e(TAG, "onMeasure--widthSize-->" + widthSize);
Log.e(TAG, "onMeasure--heightMode-->" + heightMode);
Log.e(TAG, "onMeasure--heightSize-->" + heightSize);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Log.e(TAG, "onLayout");
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.GRAY);
// FILL填充, STROKE描邊,FILL_AND_STROKE填充和描邊
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
int with = getWidth();
int height = getHeight();
Log.e(TAG, "onDraw---->" + with + "*" + height);
float radius = with / 4;
canvas.drawCircle(with / 2, with / 2, radius, mPaint);
mPaint.setColor(Color.BLUE);
RectF oval = new RectF(with / 2 - radius, with / 2 - radius, with / 2
+ radius, with / 2 + radius); //用于定義的圓弧的形狀和大小的界限
canvas.drawArc(oval, 270, 120, true, mPaint); //根據(jù)進度畫圓弧
}
}

在布局中如何使用

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.whoislcj.views.PercentView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp" />
</LinearLayout>

顯示效果:

如果布局文件改成

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.whoislcj.views.PercentView
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_margin="10dp" />
</LinearLayout>

顯示效果變成

總結(jié):

本篇主要介紹Android自定義控件的基本繪制原理,會在下一篇中介紹如何自定義屬性。希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Android ListView組件詳解及示例代碼

    Android ListView組件詳解及示例代碼

    本文主要介紹Android ListView,這里整理了ListView 組件的資料,并附示例代碼和實現(xiàn)效果圖,有需要的朋友可以參考下
    2016-08-08
  • Android中實現(xiàn)iOS中的毛玻璃效果

    Android中實現(xiàn)iOS中的毛玻璃效果

    為了實現(xiàn)毛玻璃效果,我們需要一組compute kernels(.rs文件中編寫),及一組用于控制renderScript相關的Javaapi(.rs文件自動生成為Java類)。 這篇文章主要介紹了Android中實現(xiàn)iOS中的毛玻璃效果,需要的朋友可以參考下
    2017-06-06
  • Android下2d物理引擎Box2d用法簡單實例

    Android下2d物理引擎Box2d用法簡單實例

    這篇文章主要介紹了Android下2d物理引擎Box2d用法,實例分析了在Android平臺上使用Box2d的基本技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • BroadcastReceiver靜態(tài)注冊案例詳解

    BroadcastReceiver靜態(tài)注冊案例詳解

    這篇文章主要為大家詳細介紹了BroadcastReceiver靜態(tài)注冊案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android將應用調(diào)試log信息保存在SD卡的方法

    Android將應用調(diào)試log信息保存在SD卡的方法

    Android將應用調(diào)試log信息保存在SD卡的方法大家都知道嗎,下面腳本之家小編給大家分享Android將應用調(diào)試log信息保存在SD卡的方法,感興趣的朋友參考下
    2016-04-04
  • Android之開發(fā)消息通知欄

    Android之開發(fā)消息通知欄

    本文主要介紹了Android開發(fā)消息通知欄的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Android 拍照選擇圖片并上傳功能的實現(xiàn)思路(包含權(quán)限動態(tài)獲取)

    Android 拍照選擇圖片并上傳功能的實現(xiàn)思路(包含權(quán)限動態(tài)獲取)

    這篇文章主要介紹了Android 拍照(選擇圖片)并上傳(包含權(quán)限動態(tài)獲取),本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Android入門之ListView應用解析(二)

    Android入門之ListView應用解析(二)

    這篇文章主要介紹了Android入門之ListView應用,繼上一篇之后將對Android的ListView用法做更深入的剖析,需要的朋友可以參考下
    2014-08-08
  • Android相機、圖冊demo

    Android相機、圖冊demo

    這篇文章主要為大家詳細介紹了Android相機、圖冊的基本常見使用方法,幾乎涵蓋了Android相機、圖冊操作方法,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android監(jiān)聽ScrollView滑動距離的簡單處理

    Android監(jiān)聽ScrollView滑動距離的簡單處理

    這篇文章主要為大家詳細介紹了Android監(jiān)聽ScrollView滑動距離的簡單處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

博客| 古田县| 新邵县| 高雄县| 吕梁市| 崇明县| 佳木斯市| 贵定县| 楚雄市| 石家庄市| 浏阳市| 荥阳市| 滨海县| 枣强县| 新竹县| 阿勒泰市| 静乐县| 桓仁| 隆子县| 嘉禾县| 射阳县| 武山县| 会宁县| 罗田县| 辉南县| 永昌县| 淮滨县| 密云县| 琼海市| 高碑店市| 攀枝花市| 岱山县| 平塘县| 哈尔滨市| 策勒县| 丰城市| 韩城市| 朝阳县| 同仁县| 镶黄旗| 天峨县|