app/android

[android] android 고급 위젯 다루기1

환테크 2021. 10. 28. 19:00
반응형

 

 

 

 

 

 

 

 

날짜와 시간 관련 위젯

 

 

아날로그시계, 디지털시계

 

화면에 시간을 표시하는 위젯으로 시계를 표현하는 용도

View 클래스에서 상속받기 때문에 backgroud 속성 등을 설정 가능하다

-DigitakClock은 textColor 같은 속성도 설정 가능하다

 

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <AnalogClock
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <DigitalClock
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center" />

</LinearLayout>

 

 

 

실행결과

 

 

 

 

 

 

 

 

타임피거, 데이트피커, 캘린더 뷰

 

타임피커(TimePicker) : 시간 표시와 조절

데이트피커(DatePicker)와 캘린더뷰(CalendarView) : 날짜 표시와 조절

캘린더뷰 xml 속성

showWeekNumber : 현재 몇 주차인지를 각 주의 맨 앞에 출력한다

디폴드는 true이지만 false로 하는 것이 더 깔끔하고 보기 좋다

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TimePicker
        android:timePickerMode="spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <DatePicker
        android:datePickerMode="spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

 

 

 

실행결과

 

 

 

 

 

 

 

<예제> 날짜/시간 예약 앱 만들기

 

 

 

 

activity_main.xml

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="20211666 ㄱㅇㅇ" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Chronometer
            android:id="@+id/chronometer1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:format="예약이 걸린 시간 %s "
            android:gravity="center"
            android:textSize="20dp" /> // 타이머 설정

        <Button
            android:id="@+id/btnStart"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="예약 시작" /> //예약 버튼 만들기


    </LinearLayout>

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/rdoCal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="날짜 설정 (캘린더뷰)" /> // 날짜 라디오버튼 만들기

        <RadioButton
            android:id="@+id/rdoTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="시간 설정" /> // 시간 라디오버튼 만들기

    </RadioGroup>

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1" > // 레이아웃을 다시만듬 안보이게할거기때문

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center" > // framelayout 사용한거 잘보셈

            <CalendarView
                android:id="@+id/calendarView1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:showWeekNumber="false" /> // 달력만들기

                <TimePicker
                    android:id="@+id/timePicker1"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:timePickerMode="spinner" /> // 타이머

            </FrameLayout>
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:background="#CCCCCC"> // 완료레이아웃 만들기

            <Button
                android:id="@+id/btnEnd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="예약완료" />

            <TextView
                android:id="@+id/tvYear"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="0000" />

        </LinearLayout>

</LinearLayout>

 

 

 

MainActivity.kt

 

 

package kr.ac.dongyang.project6_1

import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.SystemClock
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        title = "시간 예약"

        timePicker1.visibility = View.INVISIBLE
        calendarView1.visibility = View.INVISIBLE // 처음에 달력이랑 타이머안보영

        rdoCal.setOnClickListener {
            timePicker1.visibility = View.INVISIBLE
            calendarView1.visibility = View.VISIBLE // rdoCal 을 누르면 캘린더만보이기
        }
        rdoTime.setOnClickListener {
            timePicker1.visibility = View.VISIBLE
            calendarView1.visibility = View.INVISIBLE // rdoTime을 누르면 시간설정만 보이기
        }

        btnStart.setOnClickListener {
            chronometer1.base = SystemClock.elapsedRealtime()
            chronometer1.start()
            chronometer1.setTextColor(Color.RED) // 시작 버튼 액션
        }

        var selectYear : Int = 0
        var selectMonth : Int = 0
        var selectdayOfMonth : Int = 0
        btnEnd.setOnClickListener {
            chronometer1.stop()
            chronometer1.setTextColor(Color.BLUE)

            tvYear.text = "" + selectYear + "년" + selectMonth + "월" + selectdayOfMonth + "일" + timePicker1.currentHour + "시" + timePicker1.currentMinute + "분"
        } // 끝에 완료누르면 총 설정한거 나오기

        calendarView1.setOnDateChangeListener{ calendarView1, i, i2, i3 ->
            selectYear = i
            selectMonth = i2
            selectdayOfMonth = i3
        }


    }
}

 

 

 

실행결과

 

 

 

 

 

완성~~~~~~~~

 

 

 

 

 

 

 

시크바(SeekBar)

 

 

프로그래스바의 하위 클래스로 사용법이 비슷하다

사용자가 터치로 임의 조절이 가능하다

음량을 조절하거나 동영상 재생 시 사용자가 재생 위치를 지정하는 용도로 사용할 수 있다

 

 

레이팅바(RatingBar)

 

 

진행 상태를 별 모양으로 표시

프로그레스바의 하위 클래스로 사용법이 비슷하다

서적, 음악, 영화 등에 대한 선호도를 나타날때 주로 사용한다

주로 사용되는 xml 속성

-numStrars

 

 

 

 

<예제> 시크바와 레이팅바를 활용한 예제

 

 

activity_main.xml

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="20211666 ㄱㅇㅇ" />

    <SeekBar
        android:id="@+id/redBar"
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="20" />

    <TextView
        android:id="@+id/redText"
        android:layout_margin="30dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="red 값 : " />

    <SeekBar
        android:id="@+id/greenBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="50" />

    <TextView
        android:id="@+id/greenText"
        android:layout_marginLeft="30dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="green 값 : " />


    <SeekBar
        android:id="@+id/blueBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="125" />

    <TextView
        android:id="@+id/blueText"
        android:layout_marginLeft="30dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="blue 값: " />

    <Button
        android:id="@+id/btnOk"
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="확인" />

    <View
        android:id="@+id/dpView"
        android:background="#000000"
        android:layout_width="match_parent"
        android:layout_height="200dp" />


</LinearLayout>

 

 

MainActivity.kt

 

package kr.ac.dongyang.test6_1

import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.SeekBar
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    var red = 0
    var green = 0
    var blue = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        red = redBar.progress
        green = greenBar.progress
        blue = blueBar.progress

        redText.text = "red 값 : " + red
        greenText.text = "green 값 : " + green
        blueText.text = " blue 값 : " + blue

        redBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2:Boolean) {
                red = p1
                greenText.text = "레드값 : " + red
            }
            override fun onStartTrackingTouch(p0: SeekBar?) {
            }
            override fun onStopTrackingTouch(p0: SeekBar?) {
            }
        })

        greenBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2:Boolean) {
                green = p1
                greenText.text = "그린값 : " + green
            }
            override fun onStartTrackingTouch(p0: SeekBar?) {
            }
            override fun onStopTrackingTouch(p0: SeekBar?) {
            }
        })

        blueBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {

            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2:Boolean) {
                blue = p1
                greenText.text = "블루값 : " + blue
            }
            override fun onStartTrackingTouch(p0: SeekBar?) {
            }
            override fun onStopTrackingTouch(p0: SeekBar?) {
            }
        })
        
        //람다식표현(OnclickListener (interface)는 abstract method 가 onclick 하나이다)

        btnOk.setOnClickListener {
            dpView.setBackgroundColor(Color.rgb(red, green, blue))
            Toast.makeText(applicationContext, "버튼을 눌렀어영",
                Toast.LENGTH_LONG).show()
        }



    }
}

 

 

 

실행결과

 

 

 

 

 

 

 

 

이런식으로도 처리 가능하다 

 

책의 있길래 퍼왔당ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ(내가만든거 아뉨)

 

 

 

 

 

 

 

반응형