簡(jiǎn)單自定義滑動(dòng)控件

先上個(gè)效果圖

1.控件主代碼

public class SlideView extends View {

    private float width = -1;
    private float height = -1;
    private Paint bluePaint = null;
    private Paint whitePaint = null;
    private Paint textPaint = null;
    private float strokeWidth = 3;
    private float contentBoundary = 10;
    private float btnRadius = -1;
    private float currentX = -1;
    private float minX = -1;
    private float maxX = -1;

    private boolean clicked = false;
    private OnSlideListener listener;


    public SlideView(Context context) {
        this(context, null);
    }

    public SlideView(Context context, AttributeSet attrs) {
        this(context, attrs, -1);
    }

    public SlideView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        bluePaint = new Paint();
        bluePaint.setAntiAlias(true);
        bluePaint.setColor(Color.parseColor("#099CE9"));
        whitePaint = new Paint();
        whitePaint.setAntiAlias(true);
        whitePaint.setColor(Color.parseColor("#FFFFFF"));
        textPaint = new Paint();
        textPaint.setColor(Color.parseColor("#909090"));
        textPaint.setTextSize(26);
        textPaint.setTextAlign(Paint.Align.CENTER);

    }

    public void setOnSlideListener(OnSlideListener listener) {
        this.listener = listener;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //根據(jù)控件的寬高設(shè)置內(nèi)部數(shù)值
        if (width != getMeasuredWidth() || height != getMeasuredHeight()) {
            width = getMeasuredWidth();
            height = getMeasuredHeight();
            btnRadius = (height - (contentBoundary * 2)) / 2;
            minX = contentBoundary + btnRadius;
            maxX = width - contentBoundary - btnRadius;
            currentX = minX;
            invalidate();
        }
    }

    /**
     * 恢復(fù)到原始狀態(tài)
     */
    public void reset() {
        currentX = minX;
        invalidate();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        getParent().requestDisallowInterceptTouchEvent(true);
        float x = event.getX();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (x >= currentX - btnRadius && x <= currentX + btnRadius) {
                    clicked = true;
                }

                break;
            case MotionEvent.ACTION_MOVE:
                if (!clicked) {
                    return true;
                }
                if (x < minX) {
                    currentX = minX;
                } else if (x > maxX) {
                    currentX = maxX;
                } else {
                    currentX = x;
                }
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                clicked = false;
                if (listener != null) {
                    if (currentX < maxX) {
                        listener.onCancel(this);
                    } else {
                        listener.onComplete(this);
                    }
                }
                currentX = minX;
                invalidate();
                break;
        }
        return true;
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (width == -1 || height == -1) {
            return;
        }
        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
                | Paint.FILTER_BITMAP_FLAG));
        drawRounRect(canvas, 0, 0, width, height, bluePaint);
        drawRounRect(canvas, strokeWidth, strokeWidth, width - strokeWidth, height - strokeWidth, whitePaint);
        drawRounRect(canvas, contentBoundary, contentBoundary, currentX + btnRadius, height - contentBoundary, bluePaint);

    }

    /**
     * 畫半圓的矩形
     */
    private void drawRounRect(Canvas canvas, float l, float t, float r, float b, Paint paint) {
        float h2 = (b - t) / 2;
        canvas.drawCircle(l + h2, t + h2, h2, paint);
        canvas.drawCircle(r - h2, t + h2, h2, paint);
        canvas.drawRect(l + h2, t, r - h2, b, paint);
    }

}

2.監(jiān)聽類代碼

public interface OnSlideListener {
    void onComplete(View v);

    void onCancel(View v);
}

3.在布局文件中調(diào)用控件

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.sandu.mavenproject.widget.SlideView
        android:id="@+id/slide_view"
        android:layout_width="match_parent"
        android:layout_height="@dimen/px100dp"
        android:layout_marginLeft="@dimen/px30dp"
        android:layout_marginRight="@dimen/px30dp"
        android:layout_marginTop="@dimen/px20dp" />

</RelativeLayout>

4.在activity中設(shè)置回調(diào)

   SlideView slideView = (SlideView) findViewById(R.id.slide_view);
        slideView.setOnSlideListener(new OnSlideListener() {
            @Override
            public void onComplete(View v) {
                Toast.makeText(MainActivity.this, "滑動(dòng)成功", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancel(View v) {
                Toast.makeText(MainActivity.this, "滑動(dòng)取消", Toast.LENGTH_SHORT).show();
            }
        });

補(bǔ)充一下
為了解決控件的橫向滑動(dòng)與縱向滑動(dòng)的沖突束析,添加了下面代碼

  getParent().requestDisallowInterceptTouchEvent(true);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚣驼,一起剝皮案震驚了整個(gè)濱河市技竟,隨后出現(xiàn)的幾起案子珍促,更是在濱河造成了極大的恐慌拿撩,老刑警劉巖押搪,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亿扁,死亡現(xiàn)場(chǎng)離奇詭異捺典,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)从祝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門襟己,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人牍陌,你說(shuō)我怎么就攤上這事擎浴。” “怎么了呐赡?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵退客,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我链嘀,道長(zhǎng)萌狂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任怀泊,我火速辦了婚禮茫藏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霹琼。我一直安慰自己务傲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布枣申。 她就那樣靜靜地躺著售葡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忠藤。 梳的紋絲不亂的頭發(fā)上挟伙,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音模孩,去河邊找鬼尖阔。 笑死贮缅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的介却。 我是一名探鬼主播谴供,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼齿坷!你這毒婦竟也來(lái)了桂肌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤永淌,失蹤者是張志新(化名)和其女友劉穎轴或,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰禀,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡照雁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了答恶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饺蚊。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悬嗓,靈堂內(nèi)的尸體忽然破棺而出污呼,到底是詐尸還是另有隱情,我是刑警寧澤包竹,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布燕酷,位于F島的核電站,受9級(jí)特大地震影響周瞎,放射性物質(zhì)發(fā)生泄漏苗缩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一声诸、第九天 我趴在偏房一處隱蔽的房頂上張望酱讶。 院中可真熱鬧,春花似錦彼乌、人聲如沸泻肯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灶挟。三九已至,卻和暖如春毒租,著一層夾襖步出監(jiān)牢的瞬間稚铣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榛泛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓噩斟,卻偏偏與公主長(zhǎng)得像曹锨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剃允,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)沛简、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評(píng)論 4 62
  • 作者簡(jiǎn)介: 吳軍博士斥废,硅谷投資人椒楣,豐元資本創(chuàng)始合伙人,計(jì)算機(jī)科學(xué)家牡肉。 《大學(xué)之路—陪女兒在美國(guó)選大學(xué)》為人民郵電出...
    海峰匠閱讀 828評(píng)論 2 7
  • overisover閱讀 423評(píng)論 0 0
  • 我總覺得捧灰,我可能患上了成長(zhǎng)焦慮癥,哈哈统锤。 這是一個(gè)好時(shí)代毛俏,各種平臺(tái),各種資源饲窿,各種課程煌寇,極為豐富,物美價(jià)廉逾雄,任君選...
    薄荷草2016閱讀 370評(píng)論 0 0