Я делаю детское приложение, в котором ребенок может рисовать пальцем на книжном развороте, как показано ниже.

Основной вид не является ImageView. Скорее, это пользовательское представление, расширяющееся от GLSurfaceView, чтобы разрешить анимацию прокрутки страницы при перелистывании страниц. Чтобы создать холст, при нажатии на карандаш мой код запускает фрагмент с прозрачным макетом, чтобы включить рисование поверх пользовательского представления.
Работает для каждого отдельного цвета. Но когда щелкают по новому цвету, старые линии удаляются (потому что запускается новый фрагмент), и я могу снова рисовать, используя новый цвет.
Однако идеальным поведением является то, что старый рисунок сохраняется (с использованием предыдущего цвета), и пользователь должен иметь возможность продолжать рисовать с новым цветом без повторного запуска фрагмента.
В качестве теста я пока использовал только первые 3 цвета.
В DrawingFragment я фактически смог программно изменить цвет с фрагмента (на CYAN), вызвав метод changeColor
. Однако мне все еще нужно получить событие click из Activity, соответствующее каждому цвету.
Основные проблемы:
- Приложение должно запускать фрагмент только один раз на первом экземпляре любого
мелок нажал.
- Приложение должно идентифицировать, если фрагмент уже создан, и, если это так, передавать событие нажатия кнопки из Действия в Фрагмент каждый раз, когда нажимается карандаш.
У меня есть смутное представление о том, что, возможно, мне следует использовать интерфейс, но я еще не до конца понял, что это делает. Я довольно новичок в kotlin и android, и любая помощь или предложение будут с благодарностью.
Основная деятельность
class ReadBooksActivity : Activity() {
var mCurlView: CurlView? = null
var reading_toolbar : View? = null
var isUp = false
var drawColor : Int? = null
var isDrawing = false
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.readbooks_layout)
// Start Page Curl for each page
mCurlView = findViewById(R.id.curl)
mCurlView!!.setSizeChangedObserver(SizeChangedObserver())
mCurlView!!.setCurrentIndex(index)
var bookId = intent.getIntExtra("ID", 0)
Thread(Runnable {
fetchbookpages()
mCurlView!!.setBitmapProvider(BitmapProvider(mBitmaps))
}).start()
mCurlView!!.setEnableTouchPressure(true)
mCurlView!!.set2PagesLandscape(true)
mCurlView!!.setAllowLastPageCurl(true)
// Toggle Reading Toolbar
reading_toolbar = findViewById(R.id.readingtoolbar) as View
// Enable drawing on View
tabtools.setOnClickListener(View.OnClickListener {
showToolbar()
})
tabexit2.setOnClickListener(View.OnClickListener {
hideToolbar()
})
tabexit.setOnClickListener(View.OnClickListener {
onSlideViewButtonClick(reading_toolbar!!)
})
}
fun buttonClicked(view: View) {
//if (!isDrawing) {
if (view.id == R.id.crayon_black) {
drawColor = Color.BLACK
} else if (view.id == R.id.crayon_blue) {
drawColor = Color.BLUE
} else if (view.id == R.id.crayon_green) {
drawColor = Color.GREEN
}
callDrawFragment(drawColor!!)
// }
// isDrawing = true
}
fun callDrawFragment(drawColor : Int) {
val mFragment = DrawingFragment.newInstance(drawColor)
fragmentManager!!
.beginTransaction()
.replace(R.id.mainreadinglayout, mFragment)
.addToBackStack(null)
.commit()
}
}
DrawingFragment
class DrawingFragment: Fragment() {
var drawColor : Int? = null
var drawingView : DrawingView? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.drawing_layout, container, false)
val relativeLayout = view.findViewById(R.id.draw_layout) as RelativeLayout
drawColor = arguments.getInt("color")
var drawingView = DrawingView(activity, drawColor!!)
relativeLayout.addView(drawingView)
changeColor(drawingView)
return view
}
fun changeColor(view: DrawingView) {
var currentPaint = Paint()
currentPaint.setColor(Color.CYAN)
currentPaint.isAntiAlias = true
currentPaint.isDither = true
currentPaint.style = Paint.Style.STROKE
currentPaint.strokeJoin = Paint.Join.ROUND
currentPaint.strokeCap = Paint.Cap.ROUND
currentPaint.strokeWidth = 10f
view.setPaint(currentPaint)
}
companion object {
fun newInstance(color: Int): DrawingFragment {
val args = Bundle()
args.putInt("color", color)
val fragment = DrawingFragment()
fragment.arguments = args
return fragment
}
}
}
DrawingView
class DrawingView(context: Context, color : Int) : View(context) {
var mPaint: Paint? = null
val mPath: Path
init {
mPaint = Paint()
mPaint!!.isAntiAlias = true
mPaint!!.isDither = true
mPaint!!.color = color
mPaint!!.style = Paint.Style.STROKE
mPaint!!.strokeJoin = Paint.Join.ROUND
mPaint!!.strokeCap = Paint.Cap.ROUND
mPaint!!.strokeWidth = 10f
mPath = Path()
}
override fun onDraw(canvas: Canvas) {
canvas.drawPath(mPath, mPaint)
super.onDraw(canvas)
canvas.drawColor(Color.TRANSPARENT)
}
fun setPaint(mPaint: Paint) {
this.mPaint = mPaint
return
}
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> mPath.moveTo(event.x, event.y)
MotionEvent.ACTION_MOVE -> {
mPath.lineTo(event.x, event.y)
invalidate()
}
MotionEvent.ACTION_UP -> {
}
}
return true
}
}