Android的學習與實踐12(畫板(一部分),屏幕的旋轉,滑動條)

1.收獲

今天我們學習了做一個畫板,在這個畫板的實現過程中,用到了許多的東西,也學到了很多的東西,雖然今天沒有把畫板這個demo做完,但是后面的東西自己都可以做了,雖然還是要花很多的時間,但是這是值得的。今天學的東西很少,但是每一個知識點都是非常重要的,因為大的東西都是由小的東西堆積起來的,所以千萬不要小巧每一個知識點。盡管在做的過程中還噴到了問題,但是這些問題不是很大,都是由自己的不小心造成的,所以還是要有一嚴謹的態度去面對每一次,只有這樣形成習慣,才能在以后的工作中,會有出色的成績。都是為了自己,現在不管是什么困難的,不困難的,都要盡量去克服,這才能夠鍛煉自己的能力和毅力。

2.技術

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

3.技術的應用和實踐

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

image.png

image.png

相關的約束
image.png

chain屬性
image.png

image.png

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

image.png

在配置文件中我們可以利用screenoratation屬性來進行設置。
image.png

screenOrientation="sensor"http://隨著屏幕的變化而變化,但是不能倒著
screenOrientation="portrait"http://不會隨著屏幕變換
screenOrientation="landscape"http://固定橫屏
screenOrientation="sensorLandscape//感應橫屏
b.代碼設置
在onResume()設置 因為在屏幕的改變的之前都會調用它
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

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

效果:

錄制_2019_11_02_19_56_18_231.gif

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

 <!--滑動條-->
        <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://小圓點的顏色
android:max="100"http://最大值
progress 進度條圖片
progressBackground 進度條背景圖片
Thumb 小圓點圖片

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


image.png

然后我們在這個類中利用paint來繪制進度條
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.我們進行畫進度條的背景線
設置屬性


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);
                         
        //畫小圓點
            canvas.drawCircle(cx,cy,radius,circlepaint);
  }

3.畫小圓點
首先我們要先確定小圓點的大小和畫法


image.png

從上圖可知,小圓點小圓點的位置并使在線的兩端
小圓點的屬性

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

初始化小圓點的筆

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

確定小圓點的位置


image.png
image.png

畫小圓點

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

小圓點的移動

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

進度條的繪制
在進度條的繪制是我們考慮到了需不需要小圓點的情況
一個是進度條,一個是滑動條
我們設置了兩種風格供外界選擇,利用屬性的set 方法來進行設置

 public static int PROGRESS=0;//進度條
    public static int SLIDER=1;//滑動條
    private int style=PROGRESS;//樣式

set和get方法

public int getStyle() {
        return style;
    }

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

我們需要進行設置進度跳的最大值和進度

 private int max=100;//設置最大值
    public  float progress;//進度值

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

  public float getProgress() {
        return progress;
    }

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

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

畫進度條


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

然后我們mainactivity中進行設置

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

我們利用時間器讓進度條自己進行

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)監聽事件(接口)
這里用到接口是為了接收外部給內部傳遞的進度(動態)就是外部在移動過程中,進度就要到哪
1.創建接口

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

2.記錄從外部傳來的監聽者

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

3.在外部調用接口,并實線皆空的方法

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

4對于回調回來的進度進行設置

private  void callback(){
        if(onSliderChangeListener!=null){
            if(getHeight()>getWidth()){
                progress=position/getHeight();
            }else{
                progress=position/getWidth();
            }
            onSliderChangeListener.progresschange(progress*max);
        }
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,482評論 0 17
  • 沒有經歷過才是一種純碎的經歷 很多人都會說:“多去經歷一些,你會看到不同的風景會長大許多,亦或是需要承受一些不該承...
    夏木兮閱讀 533評論 2 0
  • 暑假期間,老師布置了一篇感恩父母的作文。哎呀,讓我怎么寫呢?爸爸在外地上班,好久才回家一次。 在...
    明月下落不明閱讀 526評論 0 1
  • 2019.4.3 星期三 晴 這段兒時間,佑佑只要瞅準機會就會脫掉自己的襪子。他坐在我腿上的時候,坐在嬰兒車里...
    FangFang放下自在閱讀 286評論 2 6
  • 老輩人講究香火單傳,老是念叨不孝有三,無后為大,但是生育之事,命中定數,難求測卦。長江之北的里下河流域,北方人謂之...
    默而仰先閱讀 488評論 0 1