Android自定義控制項7--自定義開關--繪製界面內容

来源:http://www.cnblogs.com/wuyudong/archive/2016/09/30/5922316.html
-Advertisement-
Play Games

本文實現全自定義控制項--自定義開關 本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,轉載請註明源地址。 自定義開關 (View),本文完成下麵內容 1. 寫個類繼承View2. 拷貝包含包名的全路徑到xml中3. 界面中找到該控制項, 設置初始信 ...


本文實現全自定義控制項--自定義開關

本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,轉載請註明源地址。

自定義開關 (View),本文完成下麵內容

1. 寫個類繼承View
2. 拷貝包含包名的全路徑到xml中
3. 界面中找到該控制項, 設置初始信息
4. 根據需求繪製界面內容

Android 的界面繪製流程: 
 測量----------> 擺放 -------->繪製
 measure ----->layout ---->draw
    |                      |                 |
 onMeasure--->OnLayout-->onDraw

新建類ToggleView,繼承自View

package com.wuyudong.toggleview.ui;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

/**
 * 自定義開關
 * 
 * @author wuyudong
 * 
 */
public class ToggleView extends View {

    /**
     * 用於代碼創建控制項
     * 
     * @param context
     */
    public ToggleView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    /**
     * 用於在xml里使用,可指定自定義屬性
     * 
     * @param context
     * @param attrs
     */
    public ToggleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    /**
     * 用於在xml里使用,可指定自定義屬性,如果指定了樣式,則走此構造函數
     * 
     * @param context
     * @param attrs
     * @param defStyle
     */
    public ToggleView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    /**
     * 設置背景圖
     * 
     * @param switchBackground
     */
    public void setSwitchBackgroundResource(int switchBackground) {

    }

    /**
     * 設置滑塊圖片資源
     * 
     * @param slideButton
     */
    public void setSlideButtonResource(int slideButton) {

    }

    /**
     * 設置開關狀態
     * 
     * @param b
     */
    public void setSwitchState(boolean b) {

    }

}

佈局如下:

<RelativeLayout 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"
    tools:context=".MainActivity" >

    <com.wuyudong.toggleview.ui.ToggleView
        android:id="@+id/toggleView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

接著將畫布進行填充,設置開關狀態

package com.wuyudong.toggleview.ui;


import com.wuyudong.toggleview.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * 自定義開關
 * 
 * @author wuyudong
 * 
 */
public class ToggleView extends View {

    private Bitmap switchBackgroundBitmap;
    private Bitmap slideButtonBitmap;
    private boolean mSwitchState = false; //開關狀態,預設關閉

    /**
     * 用於代碼創建控制項
     * 
     * @param context
     */
    public ToggleView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    /**
     * 用於在xml里使用,可指定自定義屬性
     * 
     * @param context
     * @param attrs
     */
    public ToggleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    /**
     * 用於在xml里使用,可指定自定義屬性,如果指定了樣式,則走此構造函數
     * 
     * @param context
     * @param attrs
     * @param defStyle
     */
    public ToggleView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(switchBackgroundBitmap.getWidth(),
                switchBackgroundBitmap.getHeight());
    }

    
    /** 
     * Canvas: 畫布,畫板,在上面繪製的內容都會顯示在界面上
     */
    @Override
    protected void onDraw(Canvas canvas) {//1、繪製背景
        Paint paint = new Paint();
        canvas.drawBitmap(switchBackgroundBitmap, 0, 0, paint);
        //2、繪製滑塊
        //根據開關狀態,直接設置圖片位置
        if(mSwitchState) {
            int newLeft = switchBackgroundBitmap.getWidth() - slideButtonBitmap.getWidth();
            canvas.drawBitmap(slideButtonBitmap, newLeft, 0, paint);
        } else {
            canvas.drawBitmap(slideButtonBitmap, 0, 0, paint);
        }
        
    }

    /**
     * 設置背景圖
     * 
     * @param switchBackground
     */
    public void setSwitchBackgroundResource(int switchBackground) {
        switchBackgroundBitmap = BitmapFactory.decodeResource(getResources(),
                switchBackground);

    }

    /**
     * 設置滑塊圖片資源
     * 
     * @param slideButton
     */
    public void setSlideButtonResource(int slideButton) {
        slideButtonBitmap = BitmapFactory.decodeResource(getResources(),
                slideButton);

    }

    /**
     * 設置開關狀態
     * 
     * @param b
     */
    public void setSwitchState(boolean mSwitchState) {
        this.mSwitchState = mSwitchState;
        
    }

}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本系列主要記錄javascript中,新手比較容易搞錯的地方。 (1)要特別註意相等運算符==。JavaScript在設計時,有兩種比較運算符:第一種是==比較,它會自動轉換數據類型再比較,很多時候,會得到非常詭異的結果;第二種是 比較,它不會自動轉換數據類型,如果數據類型不一致,返回false,如 ...
  • 上圖 ·聲明 ·獲取時間的某部分 ·計算之前和未來的時間 ·計算兩個日期的偏移量 ·檢查有效日期 ...
  • CSS3就是出了不少高大上的功能,3D效果、動畫、多列等等。今天寫篇文章記錄怎麼一下怎麼用CSS3寫一個動畫。 醜話還得說前頭,IE9以及以下版本不支持CSS3動畫(如真要實現可以考慮用js,不過估計效果也不太好)。chrome和safafi建議加上首碼-webkit-以向前相容老版本。 今天簡單的 ...
  • 上代碼: counter-reset 屬性設置某個選擇器出現次數的計數器的值。預設為 0。 counter-increment 屬性設置某個選取器每次出現的計數器增量。預設增量是 1。 counter()插入計數器 ...
  • ...
  • Ext.window.MessageBox是一個工具類,他繼承自Ext.window.Windoe對象,用來生成各種風格的信息提示對話框,其實例對象可以通過Ext.MessageBox或Ext.Msg進行訪問,使用Ext.MessageBox和使用Ext.Msg有相同的效果,而後者提供了更簡短的調用 ...
  • GCD即為Grand Central Dispatch的縮寫,是一種主要用於非同步處理任務的安全的高性能解決方案。 在此不對比其他非同步處理技術,只記錄GCD的使用及說明。 先記錄一些必要的概念:線程,同步,非同步,並行隊列,串列隊列 線程:程式中任務執行流的最小單元。一個應用程式,一般存在一個進程(擁有 ...
  • GPUIMAGE中GPUImageStillCamera可以調用系統相機,並實現實時濾鏡,但是我沒有找到相機全屏的方法,望知道的說一下 GPUImageStillCamera繼承自GPUImageVideoCamera類,添加了捕獲照片的功能。 GPUImageVideoCamera 初始化方法: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...