Android的學(xué)習(xí)與實(shí)踐12(畫板(一部分)墙贱,屏幕的旋轉(zhuǎn),滑動條)

1.收獲

今天我們學(xué)習(xí)了做一個畫板贱傀,在這個畫板的實(shí)現(xiàn)過程中惨撇,用到了許多的東西,也學(xué)到了很多的東西府寒,雖然今天沒有把畫板這個demo做完魁衙,但是后面的東西自己都可以做了报腔,雖然還是要花很多的時間,但是這是值得的纺棺。今天學(xué)的東西很少榄笙,但是每一個知識點(diǎn)都是非常重要的邪狞,因?yàn)榇蟮臇|西都是由小的東西堆積起來的祷蝌,所以千萬不要小巧每一個知識點(diǎn)。盡管在做的過程中還噴到了問題帆卓,但是這些問題不是很大巨朦,都是由自己的不小心造成的,所以還是要有一嚴(yán)謹(jǐn)?shù)膽B(tài)度去面對每一次剑令,只有這樣形成習(xí)慣糊啡,才能在以后的工作中,會有出色的成績吁津。都是為了自己棚蓄,現(xiàn)在不管是什么困難的,不困難的碍脏,都要盡量去克服梭依,這才能夠鍛煉自己的能力和毅力。

2.技術(shù)

(1)約束布局
(2)橫豎屏幕的切換
(3)滑動條
(4)監(jiān)聽事件(接口)

3.技術(shù)的應(yīng)用和實(shí)踐

(1)約束布局(ConstraintLayout)
定義:按照自己的理解就是為了讓控件與控件之間的關(guān)系更加緊密典尾,對于控件與控件的約束來說是更加嚴(yán)密了役拴,而不像與其他的布局是父容器的練習(xí)比較緊密。他減少了布局的嵌套钾埂,并且可以代替其他的布局河闰。
用法:

image.png

image.png

相關(guān)的約束
image.png

chain屬性
image.png

image.png

(2)橫豎屏幕的切換
在這里的橫豎屏的切換有兩種方法來實(shí)現(xiàn)
a配置文件
先要找到配置文件

image.png

在配置文件中我們可以利用screenoratation屬性來進(jìn)行設(shè)置。
image.png

screenOrientation="sensor"http://隨著屏幕的變化而變化褥紫,但是不能倒著
screenOrientation="portrait"http://不會隨著屏幕變換
screenOrientation="landscape"http://固定橫屏
screenOrientation="sensorLandscape//感應(yīng)橫屏
b.代碼設(shè)置
在onResume()設(shè)置 因?yàn)樵谄聊坏母淖兊闹岸紩{(diào)用它
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

@Override
    protected void onResume() {
        super.onResume();
        //設(shè)置橫豎屏 屏幕隨著手機(jī)的方向而改變
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    }

效果:

錄制_2019_11_02_19_56_18_231.gif

(3)滑動條
a.利用xml進(jìn)行配置

 <!--滑動條-->
        <SeekBar
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:progressBackgroundTint="#0f0"
            android:progressTint="@color/colorPrimary"
            android:thumbTint="#000000"
            android:max="100"
        />

android:progressBackgroundTint="#0f0"http://滑動條滑動前的顏色
android:progressTint="@color/colorPrimary"http://滑動條滑動后前的顏色
android:thumbTint="#000000"http://小圓點(diǎn)的顏色
android:max="100"http://最大值
progress 進(jìn)度條圖片
progressBackground 進(jìn)度條背景圖片
Thumb 小圓點(diǎn)圖片

b.自定義滑動條Slider
首先我們需要先建一個類


image.png

然后我們在這個類中利用paint來繪制進(jìn)度條
1.添加約束

<swu.xcf.drawbord.Slider
        android:id="@+id/slider"
        android:layout_width="20dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:layout_marginRight="20dp"/>

    </LinearLayout>

2.我們進(jìn)行畫進(jìn)度條的背景線
設(shè)置屬性


image.png

初始化畫筆

linePanit=new Paint(Paint.ANTI_ALIAS_FLAG);
        linePanit.setStrokeWidth(linesize);
        linePanit.setColor(lineColor);

確定屏幕的方向,開始畫線

 @Override
    protected void onDraw(Canvas canvas) {
        if(getWidth()>getHeight()){
            //橫著
            //背景線
            canvas.drawLine(0,(getHeight())/2,
                    getWidth(),(getHeight())/2,linePanit);
                   }else{
            //豎著
            canvas.drawLine((getWidth())/2,0,
                    (getWidth())/2,getHeight(),linePanit);
                         
        //畫小圓點(diǎn)
            canvas.drawCircle(cx,cy,radius,circlepaint);
  }

3.畫小圓點(diǎn)
首先我們要先確定小圓點(diǎn)的大小和畫法


image.png

從上圖可知姜性,小圓點(diǎn)小圓點(diǎn)的位置并使在線的兩端
小圓點(diǎn)的屬性

   private int cx;//中心點(diǎn)x
    private  int cy;//中心點(diǎn)y
    private int radius;//小圓點(diǎn)的半徑
    private Paint circlepaint;//小圓點(diǎn)的畫筆
    private int thumbcolor=Color.MAGENTA;//小圓點(diǎn)的顏色

初始化小圓點(diǎn)的筆

//圓點(diǎn)畫筆
        circlepaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        circlepaint.setStyle(Paint.Style.FILL);
        circlepaint.setColor(thumbcolor);

確定小圓點(diǎn)的位置


image.png
image.png

畫小圓點(diǎn)

canvas.drawCircle(cx,cy,radius,circlepaint);

小圓點(diǎn)的移動

 private int thumScale=4;//小圓點(diǎn)縮放尺寸基數(shù)
   private float position;//記錄觸摸點(diǎn)的坐標(biāo)
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.*ACTION_DOWN*: //小圓點(diǎn)放大 thumScale=2;
 if(getHeight()<getWidth()){ //橫向時 position=event.getX(); }else{ //縱向時 position=event.getY(); } break;
 case MotionEvent.*ACTION_MOVE*: //獲取觸摸點(diǎn)的值 X Y if(getHeight()<getWidth()){ //橫向時 position=event.getX(); }else{
       //縱向時 position=event.getY(); } break;
 case MotionEvent.*ACTION_UP*: thumScale=4;
 break; }
 invalidate();//重新繪制
 return true; }

進(jìn)度條的繪制
在進(jìn)度條的繪制是我們考慮到了需不需要小圓點(diǎn)的情況
一個是進(jìn)度條,一個是滑動條
我們設(shè)置了兩種風(fēng)格供外界選擇髓考,利用屬性的set 方法來進(jìn)行設(shè)置

 public static int PROGRESS=0;//進(jìn)度條
    public static int SLIDER=1;//滑動條
    private int style=PROGRESS;//樣式

set和get方法

public int getStyle() {
        return style;
    }

    public void setStyle(int style) {
        this.style = style;
    }

我們需要進(jìn)行設(shè)置進(jìn)度跳的最大值和進(jìn)度

 private int max=100;//設(shè)置最大值
    public  float progress;//進(jìn)度值

以及他們的set和get方法
我們在設(shè)置進(jìn)度是需要注意那個進(jìn)度條的長短部念,它會隨著屏幕方向不同而不同
所以我們需要進(jìn)行判斷屏幕的方向

  public float getProgress() {
        return progress;
    }

    public void setProgress(float progress) {
        this.progress = progress;
        if (progress < 1.001) {
            //將進(jìn)度值轉(zhuǎn)換為控件中的尺寸位置
            if (getHeight() < getWidth()) {
                //橫向時
                position = getWidth() * progress;
            } else {
                //縱向時
                position = getHeight() * progress;
            }
            postInvalidate();
        }
    }

    public void setMax(int max) {
        this.max = max;
    }

畫進(jìn)度條


//橫屏
 if(position>0) {
                //畫進(jìn)度條
                canvas.drawLine(0, (getHeight()) / 2,
                        position, (getHeight()) / 2, progressPaint);
            }
//豎屏
 if(position>0){
                canvas.drawLine((getWidth())/2,0,
                        (getWidth())/2,position,progressPaint);
            }

然后我們mainactivity中進(jìn)行設(shè)置

final Slider slider=findViewById(R.id.slider);
        slider.setMax(50);
        slider.setStyle(Slider.SLIDER);

我們利用時間器讓進(jìn)度條自己進(jìn)行

new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                slider.setProgress((float) (slider.getProgress()+0.001));
            }
        },0,100);

效果:


錄制_2019_11_02_20_47_51_735.gif

(4)監(jiān)聽事件(接口)
這里用到接口是為了接收外部給內(nèi)部傳遞的進(jìn)度(動態(tài))就是外部在移動過程中介劫,進(jìn)度就要到哪
1.創(chuàng)建接口

//接口
    public interface OnSliderChangeListener{
        void progresschange(float progress);
    }

2.記錄從外部傳來的監(jiān)聽者

 //滑動改變的監(jiān)聽者
    private OnSliderChangeListener onSliderChangeListener;
public void setOnSliderChangeListener(OnSliderChangeListener onSliderChangeListener) {
        this.onSliderChangeListener = onSliderChangeListener;
    }

3.在外部調(diào)用接口挚瘟,并實(shí)線皆空的方法

slider.setOnSliderChangeListener(new Slider.OnSliderChangeListener() {
            @Override
            public void progresschange(float progress) {
                System.out.println(""+progress);
            }
        });

4對于回調(diào)回來的進(jìn)度進(jìn)行設(shè)置

private  void callback(){
        if(onSliderChangeListener!=null){
            if(getHeight()>getWidth()){
                progress=position/getHeight();
            }else{
                progress=position/getWidth();
            }
            onSliderChangeListener.progresschange(progress*max);
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鞭衩,隨后出現(xiàn)的幾起案子门驾,更是在濱河造成了極大的恐慌射赛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奶是,死亡現(xiàn)場離奇詭異楣责,居然都是意外死亡竣灌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門秆麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來初嘹,“玉大人,你說我怎么就攤上這事沮趣⊥头常” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵房铭,是天一觀的道長驻龟。 經(jīng)常有香客問我,道長缸匪,這世上最難降的妖魔是什么翁狐? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮凌蔬,結(jié)果婚禮上露懒,老公的妹妹穿的比我還像新娘。我一直安慰自己砂心,他們只是感情好懈词,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著计贰,像睡著了一般钦睡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躁倒,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天荞怒,我揣著相機(jī)與錄音,去河邊找鬼秧秉。 笑死褐桌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的象迎。 我是一名探鬼主播荧嵌,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砾淌!你這毒婦竟也來了啦撮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤汪厨,失蹤者是張志新(化名)和其女友劉穎赃春,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫乱,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡织中,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年锥涕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭吼。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡层坠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刁笙,到底是詐尸還是另有隱情破花,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布采盒,位于F島的核電站旧乞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磅氨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一嫡纠、第九天 我趴在偏房一處隱蔽的房頂上張望烦租。 院中可真熱鬧,春花似錦除盏、人聲如沸叉橱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窃祝。三九已至,卻和暖如春踱侣,著一層夾襖步出監(jiān)牢的瞬間粪小,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工抡句, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留探膊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓待榔,卻偏偏與公主長得像逞壁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锐锣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程腌闯,因...
    小菜c閱讀 6,365評論 0 17
  • 沒有經(jīng)歷過才是一種純碎的經(jīng)歷 很多人都會說:“多去經(jīng)歷一些,你會看到不同的風(fēng)景會長大許多雕憔,亦或是需要承受一些不該承...
    夏木兮閱讀 520評論 2 0
  • 暑假期間姿骏,老師布置了一篇感恩父母的作文。哎呀橘茉,讓我怎么寫呢工腋?爸爸在外地上班姨丈,好久才回家一次。 在...
    明月下落不明閱讀 480評論 0 1
  • 2019.4.3 星期三 晴 這段兒時間擅腰,佑佑只要瞅準(zhǔn)機(jī)會就會脫掉自己的襪子蟋恬。他坐在我腿上的時候,坐在嬰兒車?yán)?..
    FangFang放下自在閱讀 273評論 2 6
  • 老輩人講究香火單傳趁冈,老是念叨不孝有三歼争,無后為大,但是生育之事渗勘,命中定數(shù)沐绒,難求測卦。長江之北的里下河流域旺坠,北方人謂之...
    默而仰先閱讀 475評論 0 1