๐ฆandroid github๐ฆ https://github.com/InventoryBox/InventoryBox_Android
'๋๋ง์ ๋ค์ด์ด๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฏ ๋งค์ผ๋งค์ผ ์ฝ๊ฒ ๊ธฐ๋กํ๊ณ ์ฑ์ฅํ ์ ์๋ ์ฌ๊ณ ๊ด๋ฆฌ ํ๋ซํผ', ์ฌ๊ณ ์ฐฝ๊ณ ์
๋๋ค.
๋ฐ์ฃผ์์ ์ ๋์น์ง ์๊ฒ ๋์์ฃผ๋ ๋ฐ์ฃผ ์๋ฆผ ๊ธฐ๋ฅ, ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ถ์ ํ ์ ์๋ ์ฌ๊ณ ๊ธฐ๋ก ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
๋ํ๏ผ์ฌ๊ณ ๊ตํ ๊ธฐ๋ฅ์ ํตํด ์ฌ๊ณ ๊ฐ ๋จ์ด์ง๋ ๊ฐ์์ค๋ฌ์ด ์ํฉ์๋ ๊ฐ์ธ ์ฌ์
์๋ค๊ฐ ๋คํธ์ํฌ ํ์ฑ์ ํตํด ์ฌ๊ณ ๋ฅผ ๋ณด์ถฉํ ์ ์์ต๋๋ค.
- SOPT 26th APPJAM
- ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2020.06.13 ~ 2020.07.18
//Retrofit ๋ผ์ด๋ธ๋ฌ๋ฆฌ
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
//Retrofit ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ต์ผ๋ก ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด
implementation 'com.squareup.retrofit2:retrofit-mock:2.6.2'
//๊ฐ์ฒด ์๋ฆฌ์ผ๋ผ์ด์ฆ๋ฅผ ์ํ Gson ๋ผ์ด๋ธ๋ฌ๋ฆฌ
implementation 'com.google.code.gson:gson:2.8.6'
//Retrofit ์์ Gson ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
//๋ฐฐ๊ฒฝ์ด ๋๊ทธ๋ ์ด๋ฏธ์ง๋ทฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
implementation 'de.hdodenhof:circleimageview:3.1.0'
//stickyscrollview ๋ผ์ด๋ธ๋ฌ๋ฆฌ
implementation 'com.github.didikk:sticky-nestedscrollview:1.0.1'
//expandable layout
implementation 'net.cachapa.expandablelayout:expandablelayout:2.9.2'
// mpandroidchart ๋ง๋ ์ฐจํธ
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
//wheel picker datepicker
implementation 'com.super_rabbit.wheel_picker:NumberPicker:1.0.1'
//kakao ์ง๋ ๊ฒ์ api ์ด์ฉ์ ์ํ ๋ชจ๋
implementation "com.kakao.sdk:v2-user-rx:2.0.0-beta02"
implementation "com.kakao.sdk:v2-talk-rx:2.0.0-beta02"
implementation "com.kakao.sdk:v2-story-rx:2.0.0-beta02"
implementation "com.kakao.sdk:v2-link-rx:2.0.0-beta02"
implementation "com.kakao.sdk:v2-navi:2.0.0-beta02"
๊ธฐ๋ฅ | ์์ธ ๊ธฐ๋ฅ | ๋ด๋น |
---|---|---|
์คํ๋ ์ | ์คํ๋ ์ ํ๋ฉด | ์ ์ฑ์ |
๋ก๊ทธ์ธ | ๋ก๊ทธ์ธ | ์ ์ฑ์ |
ํ์๊ฐ์ | ์ด๋ฉ์ผ ์ธ์ฆ | ์ ์ฑ์ |
ํ | ์ฌ๊ณ ๋ชฉ๋ก | ์ ์ฑ์ |
๋ฐ์ฃผ ํ์ธ | ์ ์ฑ์ | |
์ฒดํฌ๋ฐ์ค | ๊น๊ฐ์ | |
๋๋ณด๊ธฐ | ์ ์ฑ์ | |
๋ฉ๋ชจ์์ | ์ ์ฑ์ | |
Side Menu View | ์ ์ฑ์ | |
์ฌ๊ณ ๊ธฐ๋ก | ์บ๋ฆฐ๋ | ์ ํ์ง |
Date pickerView Custom | ๊น๊ฐ์ | |
์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ | ์ ํ์ง | |
์นดํ ๊ณ ๋ฆฌ ํํฐ | ์ ํ์ง | |
์นดํ ๊ณ ๋ฆฌ ์์ | ์ ํ์ง | |
์นดํ ๊ณ ๋ฆฌ ์ถ๊ฐ | ์ ํ์ง | |
์ฌ๋ฃ ์ถ๊ฐ | ์ ํ์ง | |
์ฌ๋ฃ ๋ชฉ๋ก | ์ ํ์ง | |
์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ | ์ ํ์ง | |
Check Box | ์ ํ์ง | |
Alert Custom | ์ ํ์ง | |
์ฌ๊ณ ๋ ์ถ์ด | ์บ๋ฆฐ๋ day ๋ถ๋ฅ | ๊น๊ฐ์ |
์บ๋ฆฐ๋ Week ๋ถ๋ฅ | ๊น๊ฐ์ | |
์นดํ ๊ณ ๋ฆฌ ์ ํ | ๊น๊ฐ์ | |
์นดํ ๊ณ ๋ฆฌ ํํฐ | ๊น๊ฐ์ | |
Graph | ๊น๊ฐ์ | |
์บ๋ฆฐ๋ | ๊น๊ฐ์ | |
์ฌ๊ณ ๊ตํ | ๊ฐ๊ฒ ์์น ์ค์ | ๊น๊ฐ์ |
์นดํ ๊ณ ๋ฆฌ | ๊น๊ฐ์ | |
๊ฒ์๊ธ ์ ๋ ฌ | ๊น๊ฐ์ | |
๊ฒ์๊ธ ์์ธ | ๊น๊ฐ์ | |
๊ฒ์๊ธ ๋ฑ๋ก | ๊น๊ฐ์ |
ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๋ ํฌ๊ฒ activity, adapter, data, db, fragment, graph, network, viewholder, etc ๋ก ๋ถ๋ฅํ๋ค. network์๋ ์ฑ๊ธํค์ธ RequestToServer, interface์ธ NetworkService, kotlin ํ์ฅํจ์๋ฅผ ์ด์ฉํ customEnqueue๊ฐ ์์ผ๋ฉฐ GET, POST, PUT์ผ๋ก ๋๋์ด ๋ถ๋ฅํ๋ค. graph ํจํค์ง๋ ๋ค์ํ ์ข ๋ฅ์ ๊ทธ๋ํ๋ฅผ ์ํ ํ์ฅํจ์๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋ค. db ํจํค์ง์๋ ์ ์ ์ ๋ณด ์ ์ฅ์ ์ํ SharedPreferenceController๊ฐ ๋ค์ด์๋ค. etc ํจํค์ง์๋ datepicker, recyclerview decoration ๋ฑ ๋ค์ํ custom์ ์ํ ํด๋์ค์ ํ์ฅ ํจ์๋ค์ด ์๋ค.
์ฒดํฌ๋ฐ์ค - onHomeCheckLister๋ฅผ ์ด์ฉํ์ฌ ์ฒดํฌ๋ฐ์ค์ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ์ฐ๊ฒฐ
'์์ธํ' ๋ฒํผ์ ๋๋ฌ ์ต๊ทผ 5์ผ์ ์ฌ๊ณ ์ถ์ด๋ฅผ ํ์ธ - expandable list view ์ MPAndroidChart ์ด์ฉ
WheelPicker ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์ปค์คํ
๋ฐ์ดํธ ํผ์ปค ์ ์
MPAndroidChart ์ด์ฉํ์ฌ ์ฃผ๊ฐ ๊ทธ๋ํ ๊ตฌํ
MPAndroidChart ์ด์ฉํ์ฌ ๋น๊ต ๊ทธ๋ํ ๊ตฌํ
Kakao API ์ด์ฉ, ์ฃผ์ ๊ฒ์
๋ ์ด์์์ ์งค ๋ margin์ผ๋ก ์ฌ๋ฐฑ์ ์ฃผ๊ธฐ๋ณด๋ค๋ constraintLayout์ guideline ์์ฑ์ ์ด์ฉํ์ฌ ๋ทฐ๋ค์ guideline์ ๋ง์ถ์๋ค.
ex)
-
activity_login.xml์์ guideline๊ณผ match_constraint ์ด์ฉ guideline์ ์ด์ฉํ์ฌ ์์ชฝ ์ฌ๋ฐฑ์ ๋ง์ถ๊ณ ๋ทฐ๋ค์ width๋ฅผ match_constraint๋ก ํ์ฌ guideline์ ๊ฝ ์ฐจ๊ฒ ์ง์ ํ๋ค.
-
activity_sign_up.xml์์ match_constraint, chain, guideline ์ด์ฉ guideline์ ์ด์ฉํ์ฌ ์์ชฝ ์ฌ๋ฐฑ์ ๋ง์ถ๊ณ ๋ทฐ๋ค์ width๋ฅผ match_constraint๋ก ํ์ฌ guideline์ ๊ฝ ์ฐจ๊ฒ ์ง์ ํ๊ณ , chain์ ์ด์ฉํ์ฌ ๊ฐ ๋ทฐ๋ค์ ์ฐ๊ฒฐํ๋ค.
-
activity_drawer.xml์์ chain ์์ฑ ํ์ฉ ๊ฐ ํญ๋ชฉ๋ค์ ํ๋กํ constraintlayout๊ณผ chain์ผ๋ก ์ฐ๊ฒฐํ๊ณ Vertical chainStyle์ packed๋ก ์ง์ ํ์ฌ ๋ถ์๋ค.
-
activity_drawer.xml์์ match_constraint ์์ฑ ํ์ฉ ๋ ์ด์์์ ๊ฐ ๋ฉ๋ด๋ค์ ๊ฝ ์ฐจ๊ฒ ๋ง์ถ๊ธฐ ์ํด ๋ชจ๋ ๋ฉ๋ด๋ค์ layut_width์ 0dp๋ก match_constraint ์์ฑ์ ์ ์ฉํ๋ค.
-
activity_add.xml์์ guidline ์์ฑ ํ์ฉ
-
fragment_graph_detail.xml ์์ guideline ์์ฑ, match_constraint ์ฌ์ฉ
-
fragment_graph_detail.xml ์์ guideline ์์ฑ ํ์ฉ ์ผ์ชฝ์ ๊ฐ์ margin ๊ฐ์ ์ฃผ๊ธฐ ์ํด guideline์ ๋ง๋ ํ constraint ์ ์ฉ
๋ทฐ๋ฅผ ๋ถ๋ชจ์ ์ฐ๊ด์ง์ด ์ฌ๋ฐฑ์ ์ ์ฉํ๋ ๋ฐฉ์์ด ์๋๋ผ ๊ฐ๊น์ด ๋ทฐ์๊ฒ ์ ์ฝ์กฐ๊ฑด์ ๊ฑธ์ด ์ฌ๋ฐฑ์ ํตํด ์์น๋ฅผ ์ง์ ํ๋ค.
- textView์ text ๋ด์ฉ์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ ธ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ width ์์ฑ์ wrap_content ์์ฑ ์์ฃผ๋ก ์ฌ์ฉ ex) ์ฌ์ฉ์ ์ด๋ฆ, ์ฃผ์, ๋ ์ง, ๋ฐ์ฃผ ํ์ธ ๋ชฉ๋ก ๋ฑ
- activity_drawer.xml์ match_constraint๋ฅผ ํ์ฉํ์ฌ ๋ ์ด์์์ ๊ฐ ๋ฉ๋ด๋ค์ ๊ฝ ์ฐจ๊ฒ ์ง์
- ํ์๊ฐ์ , ๋ก๊ทธ์ธ ๋ทฐ์์ match_constraint๋ฅผ ํ์ฉํ์ฌ guideline์ ๊ฐ editText ๋ทฐ๋ค์ ๊ฝ ์ฐจ๊ฒ ์ง์
GraphFragment ์์ category์ ํด๋นํ๋ ๊ฐ๋ค์ ์๋ก์ด arrayList์ ๋ฃ์ด adapter ์ ๋ฐ์ํด์ฃผ๊ธฐ
if(category_idx>1){
sorted_datas_graph = datas_graph.filter {
it.categoryIdx==category_idx
}.toMutableList()
graph_adapter.datas = sorted_datas_graph
graph_adapter.notifyDataSetChanged()
ExchangeFoodFragment, ExchangeProductFragment ์์ ํด๋นํ๋ data ๋ค๋ง ๋ฃ์ด์ฃผ๊ธฐ
for(data in it.data.postInfo){
datas.add(data)
}
val sorted : MutableList<PostInfo> = datas.filter {data->
data.isFood==1
}.toMutableList()
exchangeRVAdapter.datas=sorted
exchangeRVAdapter.notifyDataSetChanged()
' '
### custom ํ์ฅ ํจ์ ์ฌ์ฉ
#### customEnqueue
kotlin extension์ ์ด์ฉํ ๋ฉ์๋๋ฅผ ์ ์ฉํ์๋ค. ํต์ ๋ถ๋ถ๋ง๋ค customEnqueue ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฐ๋ณต๋๋ ์์๋ค์ ์ค์ผ ์ ์์๋ค.
```kotlin
fun<ResponseType> Call<ResponseType>.customEnqueue(
onFail:()-> Unit={ Log.d("network", "ํต์ ์คํจ")},
onSuccess:(ResponseType)->Unit,
onError:()->Unit={}
){
this.enqueue(object: Callback<ResponseType> {
override fun onFailure(call: Call<ResponseType>, t: Throwable){
onFail()
Log.d("network", t.message)
}
override fun onResponse(call: Call<ResponseType>, response: Response<ResponseType>){
response.body()?.let{
onSuccess(it)
}?:onError()
Log.d("network", response.message())
Log.d("network", response.code().toString())
}
})
}
// color res id๋ก๋ถํฐ color ๊ฐ ๋ฐํ
fun Context.getColorFromRes(color:Int):Int{
return ContextCompat.getColor(this, color)
}
// datas : ์ต๊ทผ 5์ผ ์ฌ๊ณ ๋ int arraylist
// day : ๋ง์ง๋ง ์ฌ๊ณ ๋์ ์์ผ - ์ผ์์ผ(0) ~ ํ ์์ผ(6)
fun BarChart.draw5DaysGraph(context: Context, datas : ArrayList<Int>, day : Int, count_noti:Int) {
this.setTouchEnabled(false)
datas.add(0,-1)
datas.add(0,-1)
var data : BarData = createChartData(context, datas,count_noti)
configureChartAppearance( this,context, day)
prepareChartData(context, this, data)
//bar ์์ value ์์นํ๋
this.setDrawValueAboveBar(true)
//์๋ฆผ ๊ฐ์ ๋ผ์ธ ๊ทธ๋ฆฌ๊ธฐ
if(count_noti != -1){
drawAxisLine(context, this, count_noti)
}
}
// num์ ํด๋นํ๋ value์ ์ํ์ ๊ทธ๋ฆฐ
private fun drawAxisLine(context: Context, barchart : BarChart, num : Int) {
val line : LimitLine = LimitLine(num.toFloat(), "๋ฐ์ฃผ ์๋ฆผ ๊ฐ์ $num")
barchart.axisLeft.addLimitLine(line)
line.lineColor= context.getColorFromRes(R.color.yellow)
line.labelPosition = LimitLine.LimitLabelPosition.LEFT_TOP
line.lineWidth=1f
line.textColor = context.getColorFromRes(R.color.yellow)
line.typeface = ResourcesCompat.getFont(context, R.font.nanum_square_extra_bold )
line.textSize = 12f
// y ์ถ์ผ๋ก๋ถํฐ ๊ฑฐ๋ฆฌ ์ค์
line.yOffset=3f
// line.xOffset=-10f
// barchart.animateX(2000)
// barchart.animateY(2000)
}
// ๋ฐ์ดํฐ ๋ฐ์์๋ค
private fun prepareChartData(context: Context, barchart : BarChart, data: BarData) {
//value text size ์ค์
data.setValueTextSize(12f)
// text color ์ค
data.setValueTextColor(context.getColorFromRes(R.color.darkgrey))
barchart.data=data
barchart.invalidate()
}
// BarData๋ง๋ค๊ธฐ
private fun createChartData(context: Context, datas :ArrayList<Int>, count_noti: Int): BarData {
val values: ArrayList<BarEntry> = ArrayList()
for (i in 0..6){
values.add(BarEntry(i.toFloat(), datas.get(i).toFloat()))
}
val set = CustomBarDataSet(values, "SET_LABEL",count_noti)
set.colors=
//listOf(ContextCompat.getColor(this,R.color.yellow),ContextCompat.getColor(this, R.color.gray))
listOf(context.getColorFromRes(R.color.yellow), context.getColorFromRes(R.color.middlegrey))
val dataSets = ArrayList<IBarDataSet>()
dataSets.add(set)
val data: BarData = BarData(dataSets)
//value๊ฐ์ int๋ก
data.setValueFormatter(object: ValueFormatter(){
override fun getFormattedValue(value: Float): String {
return if(value>=0) Math.round(value).toString() else "".toString()
}
})
data.setValueTypeface(ResourcesCompat.getFont(context, R.font.nanum_square_extra_bold))
//๋ง๋ ๋๋น ์์
data.barWidth=0.2f
return data
}
//chart ๊ฐ ์ด๋ป๊ฐ ๋ณด์ฌ์ง์ง
//day ๋ ๋ง์ง๋ง ๋ฐ์ดํฐ์ ์์ผ
private fun configureChartAppearance(barchart : BarChart, context: Context, day: Int) {
val DAYS = arrayListOf<String>("์ผ","์","ํ","์","๋ชฉ","๊ธ","ํ ","์ผ","์","ํ","์","๋ชฉ","๊ธ","ํ ")
val first_day = if(day-4>=0) day-4 else day+3
// Log.d("testtest","firstday = $first_day")
// val day5 = arrayListOf<String>("","","์ผ","์","ํ","์","๋ชฉ")
val day5 = arrayListOf<String>("","")
for(i in first_day..(first_day+4)){
day5.add(DAYS.get(i))
}
for(i in day5){
// Log.d("testtest","$i")
}
barchart.description.isEnabled=false
barchart.setDrawValueAboveBar(false)
//legend์์ ๊ธฐ
barchart.legend.isEnabled=false
val renderer=RoundedChartRenderer(barchart, barchart.animator, barchart.viewPortHandler)
renderer.setmRadius(30f)
barchart.renderer = renderer
val x_axis = barchart.xAxis
//x์ถ bottom์ ์์น
x_axis.position= XAxis.XAxisPosition.BOTTOM
//x์ถ์ ์์ผ ์
๋ ฅ
x_axis.granularity=1f
x_axis.setDrawGridLines(false)
x_axis.valueFormatter= object : ValueFormatter(){
override fun getFormattedValue(value:Float): String {
return day5.get(value.toInt())
// return value.toString()
}
}
x_axis.typeface= ResourcesCompat.getFont(context, R.font.nanum_square_bold )
x_axis.textSize=11f
// x_axis.spaceMin = 5f
//y์ถ์ ํ์ฑํ ์์ ๊ฐ
val axisLeft = barchart.axisLeft
axisLeft.granularity=1f
axisLeft.axisMinimum= 0f
axisLeft.labelCount=5
axisLeft.setDrawAxisLine(false)
axisLeft.setDrawLabels(false)
axisLeft.setDrawGridLines(false)
val axisRight = barchart.axisRight
axisRight.isEnabled=false
}
fun BarChart.drawDoubleGraph(context:Context, data1: ArrayList<Int>,data2 : ArrayList<Int>){
this.setTouchEnabled(false)
var values1 = ArrayList<BarEntry>()
var values2 = ArrayList<BarEntry>()
Log.d("drawdoublegraph",""+ data1.toString()+data2.toString())
// data ๋ง๋ค๊ธฐ
for(i in 0..6){
Log.d("drawdoublegraph","a"+ data1[i] + data2[i])
values1.add(BarEntry(i.toFloat(), data1[i].toFloat()))
values2.add(BarEntry(i.toFloat(), data2[i].toFloat()))
}
val data_set1 =BarDataSet(values1,"")
val data_set2 =BarDataSet(values2, "")
data_set1.color= getColorFromRes(context, R.color.middlegrey)
data_set2.color= getColorFromRes(context, R.color.yellow)
val data_sets = ArrayList<IBarDataSet>()
data_sets.add(data_set1)
data_sets.add(data_set2)
val datas = BarData(data_sets)
datas.setValueTextSize(12f)
// data.setValueTextColor(context.getColorFromRes(R.color.darkgrey))
datas.setValueTextColor(context.getColorFromRes(R.color.darkgrey))
datas.setValueTextSize(9f)
datas.setValueTypeface(ResourcesCompat.getFont(context, R.font.nanum_square_extra_bold))
datas.setValueFormatter(object :ValueFormatter(){
override fun getFormattedValue(value: Float): String {
return if(value>=0)Math.round(value).toString()else ""
}
})
datas.barWidth=0.15f
this.data=datas
this.invalidate()
this.groupBars(-0.5f, 0.5f, 0.1f)
setAxis(context, this)
//legend ์ ๊ฑฐ
// this.legend.isEnabled=false
this.legendRenderer
//legend custom
val legendEntry1 = LegendEntry("์ฒซ๋ฒ์งธ", Legend.LegendForm.LINE, 10f, 2f, null, context.getColorFromRes(R.color.middlegrey))
val legendEntry2 = LegendEntry("๋๋ฒ์งธ", Legend.LegendForm.LINE, 10f, 2f, null, context.getColorFromRes(R.color.yellow))
this.legend.setCustom(arrayListOf(legendEntry1, legendEntry2))
this.legend.isEnabled=true
this.legend.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT
this.legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP
this.legend.typeface = ResourcesCompat.getFont(context,R.font.nanum_square_extra_bold )
this.legend.textColor = context.getColorFromRes(R.color.darkgrey)
//๋๊ทธ๋ ๋ชจ
val renderer=RoundedChartRenderer(this, this.animator, this.viewPortHandler)
renderer.setmRadius(30f)
this.renderer = renderer
this.description.isEnabled=false
// var max = this.yChartMax
// drawAxisLine(this, max.toInt())
// drawAxisLine(this, max.toInt()/2)
}
fun setAxis(context: Context,barchart:BarChart) {
val x_axis = barchart.xAxis
val left_axis = barchart.axisLeft
val right_axis = barchart.axisRight
val DAYS= arrayListOf<String>("์ผ","์","ํ","์","๋ชฉ","๊ธ","ํ ")
//x์ถ์ ์ผ-์ ํ์
x_axis.valueFormatter=object :ValueFormatter(){
override fun getFormattedValue(value: Float): String {
return DAYS.get(value.toInt())
}
}
//label์ ๋ฐ๋ฅ์ ์์นํ๋๋ก
x_axis.position=XAxis.XAxisPosition.BOTTOM
x_axis.setDrawGridLines(false)
x_axis.typeface= ResourcesCompat.getFont(context,R.font.nanum_square_bold )
x_axis.textSize=11f
left_axis.setDrawGridLines(false)
left_axis.setDrawLabels(false)
left_axis.setDrawAxisLine(false)
left_axis.axisMinimum=0f
left_axis.granularity=10f
right_axis.isEnabled=false
// left_axis.isEnabled=false
//
//
// right_axis.setDrawLabels(false)
// right_axis.setDrawAxisLine(false)
// right_axis.isEnabled=false)
}
fun getColorFromRes(context: Context, color : Int) :Int{
return ContextCompat.getColor(context, color)
}
private fun drawAxisLine(barchart: BarChart, num : Int) {
val line : LimitLine = LimitLine(num.toFloat())
barchart.axisLeft.addLimitLine(line)
// line.lineColor= getColorFromRes(R.color.yellow)
}
// ์ผ์์ผ์์ ์์์ผ๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ArrayList๋ก ์ ๋ฌ๋ฐ์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค์ฃผ๋ ํจ์
fun BarChart.drawSingleGraph(context: Context, datas : ArrayList<Int>, count_noti:Int) {
this.setTouchEnabled(false)
var data : BarData = createChartData(context, datas,count_noti)
configureChartAppearance( this,context)
prepareChartData(context, this, data)
//bar ์์ value ์์นํ๋
this.setDrawValueAboveBar(true)
//์๋ฆผ ๊ฐ์ ๋ผ์ธ ๊ทธ๋ฆฌ๊ธฐ
if(count_noti > 0){
drawAxisLine(context, this, count_noti)
}else{
this.axisLeft.removeAllLimitLines()
}
}
// num์ ํด๋นํ๋ value์ ์ํ์ ๊ทธ๋ฆฐ
private fun drawAxisLine(context: Context, barchart : BarChart, num : Int) {
barchart.axisLeft.removeAllLimitLines()
val line :LimitLine = LimitLine(num.toFloat())
barchart.axisLeft.addLimitLine(line)
line.lineColor= context.getColorFromRes(R.color.yellow)
line.lineWidth=1f
// barchart.animateX(2000)
// barchart.animateY(2000)
}
// ๋ฐ์ดํฐ ๋ฐ์์๋ค
private fun prepareChartData(context: Context, barchart : BarChart,data: BarData) {
//value text size ์ค์
data.setValueTextSize(12f)
// text color ์ค
data.setValueTextColor(context.getColorFromRes(R.color.darkgrey))
barchart.data=data
barchart.invalidate()
}
// BarData๋ง๋ค๊ธฐ
private fun createChartData(context: Context, datas :ArrayList<Int>, count_noti: Int): BarData {
val values: ArrayList<BarEntry> = ArrayList()
for (i in 0..6){
values.add(BarEntry(i.toFloat(), datas.get(i).toFloat()))
}
val set = CustomBarDataSet(values, "SET_LABEL", count_noti)
set.colors=
//listOf(ContextCompat.getColor(this,R.color.yellow),ContextCompat.getColor(this, R.color.gray))
listOf(context.getColorFromRes(R.color.yellow), context.getColorFromRes(R.color.middlegrey))
val dataSets = ArrayList<IBarDataSet>()
dataSets.add(set)
val data:BarData = BarData(dataSets)
//value๊ฐ์ int๋ก
data.setValueFormatter(object: ValueFormatter(){
override fun getFormattedValue(value: Float): String {
return if(value>=0) Math.round(value).toString() else "".toString()
}
})
data.setValueTypeface(ResourcesCompat.getFont(context, R.font.nanum_square_extra_bold))
//๋ง๋ ๋๋น ์์
data.barWidth=0.2f
return data
}
//chart ๊ฐ ์ด๋ป๊ฐ ๋ณด์ฌ์ง
private fun configureChartAppearance(barchart : BarChart, context: Context) {
val DAYS = arrayListOf<String>("์ผ","์","ํ","์","๋ชฉ","๊ธ","ํ ")
barchart.description.isEnabled=false
barchart.setDrawValueAboveBar(false)
//legend์์ ๊ธฐ
barchart.legend.isEnabled=false
val renderer=RoundedChartRenderer(barchart, barchart.animator, barchart.viewPortHandler)
renderer.setmRadius(30f)
barchart.renderer = renderer
val x_axis = barchart.xAxis
//x์ถ bottom์ ์์น
x_axis.position=XAxis.XAxisPosition.BOTTOM
//x์ถ์ ์์ผ ์
๋ ฅ
x_axis.setDrawGridLines(false)
x_axis.valueFormatter= object : ValueFormatter(){
override fun getFormattedValue(value:Float): String {
return DAYS.get(value.toInt())
}
}
x_axis.typeface=ResourcesCompat.getFont(context,R.font.nanum_square_bold )
x_axis.textSize=11f
// x_axis.spaceMin = 5f
//y์ถ์ ํ์ฑํ ์์ ๊ฐ
val axisLeft = barchart.axisLeft
axisLeft.granularity=10f
axisLeft.axisMinimum= 0f
axisLeft.setDrawAxisLine(false)
axisLeft.setDrawTopYLabelEntry(false)
axisLeft.setDrawZeroLine(false)
axisLeft.setDrawLabels(false)
axisLeft.setDrawGridLines(false)
val axisRight = barchart.axisRight
axisRight.isEnabled=false
}
ExchangeFoodFragment
fun TextView.categorySetClicked(context: Context){
this.background = ContextCompat.getDrawable(context, R.drawable.rec18_yellow)
this.setTextColor(context.getColor(R.color.white))
}
fun TextView.categorySetUnClicked(context: Context){
this.background = null
this.setTextColor(context.getColor(R.color.grey))
}