1. 程式人生 > >自定義view 圓角相對佈局

自定義view 圓角相對佈局

跟以前一樣還是先上效果圖圖片如下
相對佈局

相信不少童鞋都在為定義圓角圖片而苦惱,這裡我們提供了一個圓角相對佈局比起圓角圖片複用性更好,能巢狀任何想變成圓角的內容,處理也是相當簡單的下面來看程式碼處理。

/**
 * 作用:圓角相對佈局
 * 作者:KangJH
 */
public class RCRelativeLayout extends RelativeLayout {
    public float[] radii = {0, 0, 0, 0, 0, 0, 0, 0};  // top-left, top-right, bottom-right, bottom-left
    public Path mClipPath;                            // 剪裁區域路徑
public Paint mPaint; // 畫筆 public int mEdgeFix = 10; // 邊緣修復 public RectF mLayer; // 畫布圖層大小 public RCRelativeLayout(Context context) { this(context, null); } public RCRelativeLayout(Context context, AttributeSet attrs) { this
(context, attrs, 0); } public RCRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mLayer = new RectF(); mClipPath = new Path(); mPaint = new Paint(); mPaint.setColor(Color.WHITE); mPaint.setAntiAlias(true
); } @Override//當呼叫invalidate的時候會首先呼叫該處理 protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mLayer.set(0, 0, w, h); refreshRegion(); } @Override//系統方法替代viewgroup的draw protected void dispatchDraw(Canvas canvas) { canvas.saveLayer(mLayer, null, Canvas.ALL_SAVE_FLAG); super.dispatchDraw(canvas); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mPaint.setColor(Color.WHITE); mPaint.setStyle(Paint.Style.FILL); canvas.drawPath(mClipPath, mPaint); canvas.restore(); } @Override//在設定背景的情況下會呼叫draw方法 或者設定willnotdraw為false會呼叫因此要新增切割背景的處理 public void draw(Canvas canvas) { refreshRegion(); canvas.save(); canvas.clipPath(mClipPath); super.draw(canvas); canvas.restore(); } public void refreshRegion() { int w = (int) mLayer.width(); int h = (int) mLayer.height(); mClipPath.reset(); mClipPath.addRoundRect(new RectF(getPaddingLeft(), getPaddingTop(), w - getPaddingRight(), h - getPaddingBottom()), radii, Path.Direction.CW); mClipPath.moveTo(-mEdgeFix, -mEdgeFix); // 通過空操作讓Path區域佔滿畫布 mClipPath.moveTo(w + mEdgeFix, h + mEdgeFix); } public void setRadius(int radius) { for (int i = 0; i < radii.length; i++) { radii[i] = radius; } invalidate(); } }

對外呼叫的處理就一個setRadius當然大家如果想新增其他處理可以向外新增方法這裡我只講最簡單最核心的處理。
構造方法裡面的初始化就不做過多介紹了,大家應該都明白。
當呼叫invalidate方法是我們首先呼叫的是onSizeChanged方法,refreshRegion處理是通過path劃出圓角矩形的輪廓,mClipPath.moveTo的處理很關鍵沒有這兩行zailistview快速滑動過程中可能會導致有些圓角首先展示直角然後逐漸變為圓角。
如果沒有設定背景之後會呼叫dispatchDraw處理將path畫到畫布上,如果有背景會呼叫draw這裡的處理是將背景切割保證背景也是圓角的。
下面就是外部的呼叫,也是十分簡單程式碼如下

public class MainActivity extends AppCompatActivity {
    private ListView lv_main;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv_main = findViewById(R.id.lv_main);
        List<String> aas = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            aas.add("sss");
        }
        lv_main.setAdapter(new MyAdapter(aas));

    }

    class MyAdapter extends BaseAdapter {
        private List<String> datas;

        public MyAdapter(List<String> datas) {
            this.datas = datas;
        }

        @Override
        public int getCount() {
            return datas.size();
        }

        @Override
        public Object getItem(int position) {
            return datas.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            @SuppressLint("ViewHolder") View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_rount_rect, null);
            RCRelativeLayout rc_rl = view.findViewById(R.id.rc_rl);
            rc_rl.setRadius(30);
            return view;
        }
    }
}

下面是item的佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.example.pc_304.testrrelativelayout.RCRelativeLayout
        android:id="@+id/rc_rl"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:background="#ffffff">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/download"
            android:contentDescription="@string/app_name" />
    </com.example.pc_304.testrrelativelayout.RCRelativeLayout>

</RelativeLayout>

主介面佈局如下

<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
    tools:context="com.example.pc_304.testrrelativelayout.MainActivity">

    <ListView
        android:id="@+id/lv_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

怎麼樣是不是很簡單。

相關推薦

定義view 圓角相對佈局

跟以前一樣還是先上效果圖圖片如下 相信不少童鞋都在為定義圓角圖片而苦惱,這裡我們提供了一個圓角相對佈局比起圓角圖片複用性更好,能巢狀任何想變成圓角的內容,處理也是相當簡單的下面來看程式碼處理。 /** * 作用:圓角相對佈局 * 作者:KangJ

Android 定義View-----流式佈局(粗糙實現)

//首先檢視一下佈局介面吧 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app

定義View流式佈局

  //自定義View程式碼 public final class CustomWaterFallViewGroup extends LinearLayout{     /**      *   每行最大允許字串商都 &nbs

Android 定義View引用xml佈局

在構造方法中呼叫方法: inflate(context, R.layout.activity_main, this); 一參 Context上下文 二參 xml佈局檔案id 三參 ViewGro

iOS中定義View實現layoutSubviews佈局子控制元件

iOS開發中,- (void)layoutSubviews{}方法及相關方法注意點!! ==== ```objectivec - (void)creatAutoLayoutUSE { // 一、layout相關方法 } ``` - (void)layoutSubviews

androd---定義VIEW實現網格佈局

今天在說下自定義VIEW--- 實現網格佈局的這個功能吧。最近這個需求是檢測手機螢幕是否出現問題,所以需要觸控式螢幕幕網格,看是否會變色,如果不會變色,說明螢幕對應這塊網格有問題。希望對大家在後面的類似需求的時候,有幫助 直接上程式碼吧 public class Gri

定義View,流式佈局

  寫的比較基礎, 備忘使用。 public class FlowLayout extends ViewGroup { public FlowLayout(Context context) { this(context, null); }

定義view佈局過程詳解

佈局過程,就是程式在執行時利用佈局檔案的程式碼來計算出實際尺寸的過程。 佈局分為兩個階段:測量階段和佈局階段。 測量階段:從上到下遞迴地呼叫每個 View 或者 ViewGroup 的 measure() 方法,測量他們的尺寸並計算它們的位置;  佈局階段:從上到下遞迴地呼叫每個 View 或

Android : 定義View之流式佈局

寫了一個很簡單的佈局 這是周圍圓框的drawable <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

定義view之流式佈局

如圖: 自定義view 繼承viewgroup  實現流式佈局 (程式碼中有註釋,就不一一詳解了,注意標紅欄位) public class WaterfallViewGroup extends ViewGroup { //儲存所有子View priva

(七)Flutter 佈局 建立小部件 定義view 關於佈局的一些屬性 mainAxis SizeBox Alignment stack AspectRatio ConstrainedBox

主要內容 建立LayoutDemo小部件 建立可配置圖示徽章IconBadege 小部件 Row與Column mainAxis:主軸與crossAxis 交叉軸 SizeBox 固定尺寸的盒子 Alignment 對齊 stack 一摞小部件

android定義View實現流式佈局

//先來一張效果圖 //自定義的控制元件 import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.

Android定義View的三種方式:繼承佈局,繼承原生控制元件,繼承View

 自定義View非常的常用,也是Android開發的一項基本技能,自定義View有三種方式:繼承佈局,繼承原生控制元件,繼承View。一、繼承佈局先看效果圖:程式碼實現:1.在layout資料夾中建立佈局title_view.xml,這一步根據自己需要寫,本例中的佈局如下:佈

Android 定義View ProgressBarHorizontal:橫向進度條、支援圓角、漸變、圖片

背景:因系統的ProgressBar設定圖片時,如果圖片不夠大,而在大解析度的手機上時會出現無法填充滿,所以自己寫一個,既修復該問題,又可方便拓展,所以拋磚引玉 功能介紹:橫向進度條,分為背景與封面兩層,封面與背景均支援圓角矩形、漸變、圖片。 效果圖: (上面仿微博

android定義view控制元件之一圓角背景TextView

繼昨天寫了一個TextView可以包括兩種不同的風格字型,而保證可以換行的情況下的自定義View。今天的正文還是寫一個自定義的TextView。 一慣風格首先亮出實現效果,這最是直接不過的了。看下圖: 其實不通過寫一個自定義view的方式也可以實現這個效果,但是就需你在你

android ImageView實現上面圓角下面直角(定義view實現)

主要思想: 重寫imageview,在imageview上畫一個四個圓角的方框,並把畫布下一一個圓角半徑長度,這樣就能不顯示下面對的四個角 重寫ImageView: import androi

定義View:測量measure,佈局layout,繪製draw

1. 什麼是View 在Android的官方文件中是這樣描述的:表示了使用者介面的基本構建模組。一個View佔用了螢幕上的一個矩形區域並且負責介面繪製和事件處理。 手機螢幕上所有看得見摸得著的都是View。這一點對所有圖形系統來說都一樣,例如ios的UIVi

Android中定義drawable資源實現佈局圓角邊框效果

佈局的圓角邊框效果圖如下所示: 如上圖紅色標註的部分就是一個圓角邊框效果的自定義搜尋框。 實現起來很簡單,讓佈局(Relativelayout或者LinearLayout)的background屬性引用自定義的drawable資源即可。 andro

定義View—使用clipPath或者BitmapShader實現圓角圖片

實現圓角圖片的方式有三種,上篇文章中是使用了Xfermode,這篇文章則將總結剩下的兩種clipPath、BitmapShader。這裡我們跟上一篇一樣繼承自ImageView。 公共部分 無論是使用哪種方法,都需要自定義的屬性和在構造器中獲得相應的

android定義View(2):實現百分比適應佈局

android介面適配難是歷史原因,我們只能想辦法解決。github上面已有一些佈局自適應的解決方案,今天我分享的是自定義控制元件:RelativieLayout自適應百分比寬高。直接上菜。 一,實現的效果圖 眼見為實,截圖所示,寬高都是50%,實現了自