自定義View(一)可拖拽的懸浮控件

可拖拽的懸浮控件是個(gè)比較常見(jiàn)的很簡(jiǎn)單的效果眯亦,主要知識(shí)點(diǎn):

1.View的簡(jiǎn)單自定義化戳,onDraw的重寫等

2.View事件的簡(jiǎn)單應(yīng)用

我們?cè)谶@個(gè)可拖拽的View上加個(gè)黃色的線搜吧,簡(jiǎn)單操作下這個(gè)View的樣子偎蘸,另外帚称,給這個(gè)拖拽View加上偏左吸左偏右吸右的效果嘹叫。下面直接上代碼:

public class CustomView extends android.support.v7.widget.AppCompatTextView {

    private Paint paint;//畫筆
    private int lastX;//記錄上一個(gè)X坐標(biāo)
    private int lastY;//記錄上一個(gè)Y坐標(biāo)


    public CustomView(Context context) {
        super(context);
        initDraw();
    }

    public CustomView(Context context, @Nullable  AttributeSet attrs) {
        super(context, attrs);
        initDraw();

    }

    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initDraw();
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        int rawX = (int) event.getRawX();
        int rawY = (int) event.getRawY();

        int offsetX = x - lastX;
        int offsetY = y - lastY;

        ViewGroup mViewGroup = (ViewGroup) getParent();

        //取組件父集的寬高
        int pWidth = mViewGroup.getWidth();
        int pHeight = mViewGroup.getHeight();

        //設(shè)置上下左右的坐標(biāo)臨界值
        int left = getLeft() + offsetX;
        left = left <= 0 ? 0 : left;

        int top = getTop() + offsetY;
        top = top <= 0 ? 0 : top;

        int right = getRight() + offsetX;
        right = right >= pWidth ? pWidth : right;

        int bottom = getBottom() + offsetY;
        bottom = bottom >= pHeight ? pHeight : bottom;

        //設(shè)置上下左右的坐標(biāo)為臨界值時(shí)相關(guān)變量的值
        if(top==0){
            bottom =getHeight();
        }
        if(left==0){
            right=getWidth();
        }
        if(right==pWidth){
            left=pWidth-getWidth();
        }
        if(bottom==pHeight){
            top=pHeight-getHeight();
        }
        //判斷時(shí)間種類
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                layout(left, top, right, bottom);//移動(dòng)式更新布局
                break;
            case MotionEvent.ACTION_UP:
                //松開(kāi)手時(shí)根據(jù)組件中間的位置,判斷吸左吸右
                if (rawX <= pWidth / 2) {
                    layout(0, top, getWidth(), bottom);
                } else {
                    layout(pWidth - getWidth(), top, pWidth, bottom);
                }

                break;
        }

        return true;
    }

    /**
     * 初始化畫筆
     * */
    private void initDraw() {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.YELLOW);
        paint.setStrokeWidth(1.5f);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);
        int width = getWidth();
        int height = getHeight();
        //畫布劃線
        canvas.drawLine(0, height / 2, width, height / 2, paint);
    }
}

ok丛肢,把這個(gè)組件直接在布局中展示就行了围肥,很簡(jiǎn)單。
demo git地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜂怎,一起剝皮案震驚了整個(gè)濱河市穆刻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杠步,老刑警劉巖氢伟,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幽歼,居然都是意外死亡朵锣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門甸私,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诚些,“玉大人,你說(shuō)我怎么就攤上這事皇型∥芘耄” “怎么了砸烦?”我有些...
    開(kāi)封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绞吁。 經(jīng)常有香客問(wèn)我幢痘,道長(zhǎng),這世上最難降的妖魔是什么掀泳? 我笑而不...
    開(kāi)封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任雪隧,我火速辦了婚禮西轩,結(jié)果婚禮上员舵,老公的妹妹穿的比我還像新娘。我一直安慰自己藕畔,他們只是感情好马僻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著注服,像睡著了一般韭邓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溶弟,一...
    開(kāi)封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天女淑,我揣著相機(jī)與錄音,去河邊找鬼辜御。 笑死鸭你,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的擒权。 我是一名探鬼主播袱巨,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碳抄!你這毒婦竟也來(lái)了愉老?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤剖效,失蹤者是張志新(化名)和其女友劉穎嫉入,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧尸,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咒林,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逗宁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片映九。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞎颗,靈堂內(nèi)的尸體忽然破棺而出件甥,到底是詐尸還是另有隱情捌议,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布引有,位于F島的核電站瓣颅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏譬正。R本人自食惡果不足惜宫补,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曾我。 院中可真熱鬧粉怕,春花似錦、人聲如沸抒巢。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛉谜。三九已至稚晚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間型诚,已是汗流浹背客燕。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狰贯,地道東北人也搓。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暮现,于是被迫代替她去往敵國(guó)和親还绘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 前言 上一節(jié)我們將View的測(cè)量流程理的差不多了栖袋,這篇我們來(lái)看下View的剩下的2大流程layout(布局)和dr...
    g小志閱讀 1,177評(píng)論 4 5
  • 該文為匯總網(wǎng)上優(yōu)秀的資源所得拍顷,喜歡請(qǐng)關(guān)注原作者,我記錄下來(lái)主要是為了以后我自己查找用的ref 參考啟艦Androi...
    richy_閱讀 1,103評(píng)論 3 16
  • 轉(zhuǎn)載請(qǐng)務(wù)必在文章開(kāi)頭注明出處塘幅!http://www.reibang.com/p/a3014f8442b0 一昔案、簡(jiǎn)介...
    XuYanjun閱讀 15,980評(píng)論 6 69
  • 有時(shí)候,總覺(jué)得不愿突破自己电媳,改變自己踏揣,總覺(jué)得結(jié)果會(huì)不好,寧愿一成不變匾乓。 以前我從來(lái)都不會(huì)把“可愛(ài)”這個(gè)詞和自己聯(lián)想...
    海眠君閱讀 146評(píng)論 0 0
  • 可以把文件夾下所有文件(除bat文件)添加后綴名 txt捞稿, %%ni指的是除了擴(kuò)展名外的文件名,%%nxi指的是包...
    heray閱讀 2,236評(píng)論 0 0