Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
<activity android:name=".MainActivity">
<activity android:name=".SampleActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".MainActivity"/>
<activity android:name=".ProgrammaticallyActivity"/>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.chahinem.pageindicator.sample

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearSnapHelper
Expand All @@ -25,7 +27,7 @@ class MainActivity : AppCompatActivity() {
val adapter = MyAdapter(picasso)
list.adapter = adapter
LinearSnapHelper().attachToRecyclerView(list)
adapter.swapData(LIST_ITEMS)
adapter.setItems(LIST_ITEMS)
pageIndicator attachTo list

// ViewPager
Expand Down Expand Up @@ -70,5 +72,10 @@ class MainActivity : AppCompatActivity() {
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/23161047_853121148199404_5154039615094521856_n.jpg")
)

fun start(context: Context) {
context.startActivity(
Intent(context, MainActivity::class.java))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class MyAdapter(private val picasso: Picasso) : RecyclerView.Adapter<MyViewHolde
holder.bind(picasso, items[holder.adapterPosition])
}

fun swapData(data: Iterable<MyItem>?) {
fun setItems(data: Iterable<MyItem>?) {
items.clear()
data?.let { items.addAll(data) }
notifyDataSetChanged()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.chahinem.pageindicator.sample

import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.view.ViewGroup.LayoutParams
import android.widget.LinearLayout
import android.widget.LinearLayout.VERTICAL
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import com.chahinem.pageindicator.PageIndicator
import com.chahinem.pageindicator.sample.MyAdapter.MyItem
import com.squareup.picasso.Picasso.Builder

class ProgrammaticallyActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(createContent())
}

private fun createContent(): View {
val verticalContainer = createVerticalContainer()
val pageIndicator = createPageIndicator()
val recyclerView = createRecyclerView()
pageIndicator.attachTo(recyclerView)


verticalContainer.addView(recyclerView)
verticalContainer.addView(pageIndicator)

return verticalContainer
}

private fun createVerticalContainer(): LinearLayout =
LinearLayout(this).apply { orientation = VERTICAL }

private fun createPageIndicator(): PageIndicator =
PageIndicator(this)
.apply {
layoutParams =
LinearLayout
.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
.apply { gravity = Gravity.CENTER_HORIZONTAL }
defaultColor = Color.parseColor("#C2DEFA")
selectedColor = Color.parseColor("#0075EB")
}

private fun createRecyclerView(): RecyclerView {
val recyclerView = RecyclerView(this)
val adapter = createAdapter()

val linearLayoutManager =
LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)

recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = linearLayoutManager
recyclerView.adapter = adapter

val snapHelper = PagerSnapHelper()
snapHelper.attachToRecyclerView(recyclerView)

return recyclerView
}

private fun createAdapter(): MyAdapter {
val picasso = Builder(this).build()
return MyAdapter(picasso).apply { setItems(LIST_ITEMS) }
}

companion object {
private val LIST_ITEMS = listOf(
MyItem(
"San Francisco, California",
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/25024416_182774512460963_6661054269581426688_n.jpg"),
MyItem(
"Valensole",
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/25022757_375109192929045_3153371362454667264_n.jpg"),
MyItem(
"Étretat",
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/25005816_2020789231533395_4507938399037947904_n.jpg"),
MyItem(
"Tokyo, Japan",
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/23421860_192904647945945_6319320906002857984_n.jpg"),
MyItem(
"Paris, France",
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/23347334_633654673691303_8149777143685971968_n.jpg"),
MyItem(
"New York, New York",
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/23101824_1822687121355425_8930059065124454400_n.jpg"),
MyItem(
"New York, New York",
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod",
"https://scontent-cdg2-1.cdninstagram.com/t51.2885-15/e35/23161047_853121148199404_5154039615094521856_n.jpg")
)

fun start(context: Context) {
context.startActivity(
Intent(context, ProgrammaticallyActivity::class.java))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.chahinem.pageindicator.sample

import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity

class SampleActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(createContentView())
}

private fun createContentView(): View {
val container = createVerticalContainer()
BUTTONS.map { title ->
container.addView(createButton(title))
}
return container
}

private fun createButton(title: String): View =
Button(this).apply {
text = title
setOnClickListener {
handleClick((it as Button).text.toString())
}
}

private fun handleClick(text: String) {
when (text) {
LAYOUT_PROGRAMMATICALLY -> ProgrammaticallyActivity.start(this)
else -> MainActivity.start(this)
}
}

private fun createVerticalContainer(): LinearLayout =
LinearLayout(this).apply { orientation = LinearLayout.VERTICAL }

companion object {
private const val LAYOUT_FROM_XML = "LAYOUT FROM XML"
private const val LAYOUT_PROGRAMMATICALLY = "LAYOUT PROGRAMMATICALLY"
private val BUTTONS = listOf(LAYOUT_FROM_XML, LAYOUT_PROGRAMMATICALLY)
}
}
2 changes: 1 addition & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ ext {
minSdkVersion = 14
compileSdkVersion = 28
targetSdkVersion = 28
gradleVersion = '3.2.1'
gradleVersion = '3.3.2'
kotlinVersion = '1.3.20'

supportLibraryVersion = '27.1.1'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,23 @@ class PageIndicator @JvmOverloads constructor(

private lateinit var dotSizes: IntArray
private lateinit var dotAnimators: Array<ValueAnimator>

private val defaultPaint = Paint().apply { isAntiAlias = true }
private val selectedPaint = Paint().apply { isAntiAlias = true }

var defaultColor: Int = ContextCompat.getColor(getContext(), R.color.pi_default_color)
set(value) {
field = value
defaultPaint.apply { color = value }
invalidate()
}

var selectedColor: Int = ContextCompat.getColor(getContext(), R.color.pi_selected_color)
set(value) {
field = value
selectedPaint.apply { color = value }
invalidate()
}

private val dotSize: Int
private val dotSizeMap: Map<Byte, Int>
private val dotBound: Int
Expand Down Expand Up @@ -81,11 +94,9 @@ class PageIndicator @JvmOverloads constructor(
animDuration = ta.getInteger(
R.styleable.PageIndicator_piAnimDuration, DEFAULT_ANIM_DURATION).toLong()
defaultPaint.color = ta.getColor(
R.styleable.PageIndicator_piDefaultColor,
ContextCompat.getColor(getContext(), R.color.pi_default_color))
R.styleable.PageIndicator_piDefaultColor, defaultColor)
selectedPaint.color = ta.getColor(
R.styleable.PageIndicator_piSelectedColor,
ContextCompat.getColor(getContext(), R.color.pi_selected_color))
R.styleable.PageIndicator_piSelectedColor, selectedColor)
animInterpolator = AnimationUtils.loadInterpolator(context, ta.getResourceId(
R.styleable.PageIndicator_piAnimInterpolator,
R.anim.pi_default_interpolator))
Expand Down