PullBezierZoomView 一個(gè)具有貝塞爾曲線下拉效果的自定義view

該控件具有下拉放大背景圖和貝塞爾曲線的效果.

該控件效果基于PullZoomView源碼改動(dòng)的而來,感謝Frank-Zhu的開源代碼.

github:https://github.com/X-FAN/PullBezierZoomView 歡迎star

我主要寫了一個(gè)自定義貝塞爾曲線效果的控件并整合到了Frank-Zhu的項(xiàng)目中的一個(gè)子項(xiàng)中.

這里面有個(gè)小數(shù)學(xué)知識(shí)的求解,因?yàn)樾Ч愘悹柷€的曲線頂點(diǎn)要恰好在控件底部邊界的重點(diǎn).所以我們是知道ABC三點(diǎn),去求貝塞爾曲線的控制點(diǎn).具體求解過程就不分析了,大家google二階貝塞爾曲線的公式,很容易就可以推算出來.

這里寫圖片描述

貝塞爾曲線效果控件源碼如下:

public class BezierView extends View {

    private int mWidth = 500;
    private int mHeight = 500;
    private float mMaxHeight = Integer.MAX_VALUE;
    private float mY = 0;

    private Paint mPaint;
    private Path mPath;


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

    public BezierView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BezierView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPath = new Path();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.WHITE);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int width;
        int height;

        if (widthMode == MeasureSpec.EXACTLY) {
            width = widthSize;
        } else if (widthMode == MeasureSpec.AT_MOST) {
            width = Math.min(mWidth, widthSize);
        } else {
            width = mWidth;
        }

        if (heightMode == MeasureSpec.EXACTLY) {
            height = heightSize;
        } else if (heightMode == MeasureSpec.AT_MOST) {
            height = Math.min(mHeight, heightSize);
        } else {
            height = mHeight;
        }
        setMeasuredDimension(width, height);
    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPath.reset();//繪制的主要邏輯代碼
        mPath.moveTo(0, mHeight - mY);
        mPath.quadTo(mWidth / 2, mHeight + mY, mWidth, mHeight - mY);
        mPath.lineTo(mWidth, mHeight);
        mPath.lineTo(0, mHeight);
        mPath.close();
        canvas.drawPath(mPath, mPaint);
    }

    public void setArcHeight(float height) {
        if (Math.abs(height) < mMaxHeight) {
            mY = height;
            invalidate();
        }
    }

    public float getArcHeight() {
        return mY;
    }

    public void setColor(int color) {
        mPaint.setColor(color);
    }

    public void setMaxHeight(float height) {
        mMaxHeight = height;
    }

這里提下Frank-Zhu的項(xiàng)目中放大縮小功能的實(shí)現(xiàn)是相當(dāng)?shù)穆斆?看了源碼發(fā)現(xiàn)他是利用ImagView中的scaleType="centerCrop"屬性,只要改變控件的高度,就具有了放大縮小的效果.不用自己寫額外的代碼,確實(shí)很方便.

效果圖:

bezier.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蕊连,一起剝皮案震驚了整個(gè)濱河市邪乍,隨后出現(xiàn)的幾起案子柜裸,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑保,死亡現(xiàn)場離奇詭異计技,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嗤瞎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門墙歪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贝奇,你說我怎么就攤上這事虹菲。” “怎么了掉瞳?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵毕源,是天一觀的道長。 經(jīng)常有香客問我陕习,道長霎褐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任衡查,我火速辦了婚禮瘩欺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拌牲。我一直安慰自己俱饿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布塌忽。 她就那樣靜靜地躺著拍埠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪土居。 梳的紋絲不亂的頭發(fā)上枣购,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天嬉探,我揣著相機(jī)與錄音,去河邊找鬼棉圈。 笑死涩堤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的分瘾。 我是一名探鬼主播胎围,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼德召!你這毒婦竟也來了白魂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤上岗,失蹤者是張志新(化名)和其女友劉穎福荸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肴掷,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敬锐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捆等。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滞造。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栋烤,靈堂內(nèi)的尸體忽然破棺而出谒养,到底是詐尸還是另有隱情,我是刑警寧澤明郭,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布买窟,位于F島的核電站,受9級(jí)特大地震影響薯定,放射性物質(zhì)發(fā)生泄漏始绍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一话侄、第九天 我趴在偏房一處隱蔽的房頂上張望亏推。 院中可真熱鬧,春花似錦年堆、人聲如沸吞杭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芽狗。三九已至,卻和暖如春痒蓬,著一層夾襖步出監(jiān)牢的瞬間童擎,已是汗流浹背滴劲。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顾复,地道東北人班挖。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像捕透,于是被迫代替她去往敵國和親聪姿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碴萧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • 一乙嘀、Path常用方法表 二.Path詳解 上一次除了一些常用函數(shù)之外,講解的基本上都是直線破喻,本次需要了解其中的曲線...
    呂侯爺閱讀 1,532評(píng)論 1 6
  • 貝塞爾曲線開發(fā)的藝術(shù) 一句話概括貝塞爾曲線:將任意一條曲線轉(zhuǎn)化為精確的數(shù)學(xué)公式虎谢。 很多繪圖工具中的鋼筆工具,就是典...
    eclipse_xu閱讀 27,677評(píng)論 38 370
  • 前言 扯來扯去曹质,前面三篇自定義 View 文章婴噩,終于扯完了一些知識(shí)點(diǎn),有些枯燥羽德,所以我也是講下核心點(diǎn)几莽,沒有細(xì)分析,...
    GitHubClub閱讀 1,498評(píng)論 2 27
  • 以前總是自我感覺良好宅静,覺得只能靠自己的力量來帶孩子章蚣,而且,仿佛只有自己才是真正為孩子們好姨夹,他們是那么嬌弱纤垂、那么需要...
    華麗的美麗麗閱讀 126評(píng)論 0 0