Android 使用Kotlin自定義View的方法教程
前言
隨著google宣布kotlin作為官方開發(fā)語言,在Android中使用kotlin的趨勢也越來越明顯,最近被kotlin的文章轟炸了,所以決定上手試一下,試過之后,感覺靠它靈簡直有魔性。特別是一句話寫出一個復雜的循環(huán)的時候,簡直被驚呆。而且使用AS,Java代碼可以直接轉(zhuǎn)成Kotlin。
效果圖如下:

首先是這次自定義View的效果圖,是一張餅圖。如果是用java寫的話也就幾十行,覺得換成Kotlin的話可能會更少。
示例代碼
主要的功能是可以任設定數(shù)據(jù)的個數(shù),我這里是4個數(shù)據(jù),可以任意設定每個數(shù)據(jù)的顏色。
#####首先上Kotlin代碼#####
package top.greendami.mykotlinapp
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View
/**
* Created by GreendaMi on 2017/4/10.
*/
class PPCircle : View {
var mDatas = ArrayList<Float>()
var mColors = ArrayList<Int>(4)
var mPaint: Paint = Paint()
constructor(mContext: Context) : super(mContext) {
val context = mContext
}
constructor(mContext: Context, mAttributeSet: AttributeSet) : super(mContext, mAttributeSet) {
initPaint()
val context = mContext
}
fun initPaint() {
mPaint.isAntiAlias = true
mPaint.style = Paint.Style.FILL_AND_STROKE
mPaint.color = 0xff44b391.toInt()
}
//長寬一致
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val widthSpecSize = View.MeasureSpec.getSize(widthMeasureSpec)
val heightSpecSize = View.MeasureSpec.getSize(heightMeasureSpec)
val mLayoutSize = Math.min(widthSpecSize, heightSpecSize)
setMeasuredDimension(mLayoutSize, mLayoutSize)
}
/**
* 設置數(shù)據(jù)
*/
fun setData(data: ArrayList<Float>, colors: ArrayList<Int>) {
mDatas = data
mColors = colors
invalidate()
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
if (mDatas.size == 0) {
return
}
//切掉圓心
var mPath = Path()
mPath.addCircle(width / 2f, height / 2f, width / 2f * 0.4f,Path.Direction.CW)
mPath.close()
canvas?.clipPath(mPath, Region.Op.XOR)
var total = 0f
//此處亮點
mDatas.forEach { total += it }
var rf = RectF(0f, 0f, width.toFloat(), height.toFloat())
var startAngle = -90f//起點
var i = 0
mDatas.forEach {
mPaint.color = mColors[i]
var sweepAngle = it * 360 / total
canvas?.drawArc(rf, startAngle, sweepAngle, true, mPaint)
startAngle += sweepAngle
i++
}
}
}
設置數(shù)據(jù)
package top.greendami.mykotlinapp
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main2.*
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
var mDatas = ArrayList<Float>()
mDatas.add(1f)
mDatas.add(2f)
mDatas.add(4f)
mDatas.add(2f)
var mColors = ArrayList<Int>()
mColors.add(0xff83ccd2.toInt())
mColors.add(0xffc0e1ce.toInt())
mColors.add(0xfffac55e.toInt())
mColors.add(0xffef805f.toInt())
ppCircle.setData(mDatas,mColors)
}
}
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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" tools:context="top.greendami.mykotlinapp.Main2Activity"> <top.greendami.mykotlinapp.PPCircle android:id="@+id/ppCircle" android:layout_width="300dp" android:layout_height="300dp" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="8dp" android:layout_marginRight="8dp" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp" android:layout_marginLeft="8dp" app:layout_constraintLeft_toLeftOf="parent" /> </android.support.constraint.ConstraintLayout>
#####相同功能Java代碼#####
package com.allrun.arsmartelevatorformanager.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
/**
* Created by GreendaMi on 2017/4/11.
*/
public class PPCircle extends View {
Context mContext;
List<Float> mData = new ArrayList<Float>();//數(shù)據(jù)
List<Integer> mColors = new ArrayList<Integer>();//數(shù)據(jù)對應的顏色
Paint mPaint = new Paint();
public PPCircle(Context context) {
super(context);
}
public PPCircle(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mContext = context;
initPaint();
}
private void initPaint() {
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSpecSize = View.MeasureSpec.getSize(widthMeasureSpec);
int heightSpecSize = View.MeasureSpec.getSize(heightMeasureSpec);
int mLayoutSize = Math.min(widthSpecSize, heightSpecSize);
setMeasuredDimension(mLayoutSize, mLayoutSize);
}
public void setData(List<Float> mData, List<Integer> mColors) {
this.mData = mData;
this.mColors = mColors;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mData.size() == 0) {
return;
}
//切掉圓心
Path mPath =new Path();
mPath.addCircle(getWidth()/2,getWidth()/2,getWidth()/2* 0.4f ,Path.Direction.CW);
canvas.clipPath(mPath, Region.Op.XOR);
float total = 0;
for(float temp : mData){
total = total + temp;
}
RectF rf = new RectF(0f, 0f, getWidth(), getHeight());
float startAngle = -90f;//起點
int i = 0;
for(float temp : mData){
mPaint.setColor(mColors.get(i));
float sweepAngle = temp * 360 / total;
canvas.drawArc(rf, startAngle, sweepAngle, true, mPaint);
startAngle += sweepAngle;
i++;
}
}
}
說說Kotlin和Java感覺差異比較大的地方。首先是變量的生命,Kotlin聲明時必須賦值或者初始化,java則不用,開始有點不習慣。Kotlin不需要分號結(jié)尾,Kotlin的循環(huán)用起來簡直爽YY。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- Android 自定義View的使用介紹
- Android自定義View實現(xiàn)搜索框(SearchView)功能
- Android開發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法
- Android自定義View設定到FrameLayout布局中實現(xiàn)多組件顯示的方法 分享
- Android自定義View實現(xiàn)廣告信息上下滾動效果
- Android自定義View實現(xiàn)繪制虛線的方法詳解
- Android自定義View之自定義評價打分控件RatingBar實現(xiàn)自定義星星大小和間距
- Android自定義View實現(xiàn)loading動畫加載效果
- Android自定義View實現(xiàn)漸變色進度條
- Android?自定義view中根據(jù)狀態(tài)修改drawable圖片
相關文章
簡單實現(xiàn)Android學生管理系統(tǒng)(附源碼)
這篇文章主要介紹了如何簡單實現(xiàn)Android學生管理系統(tǒng),特別適合計算機專業(yè)的即將畢業(yè)的同學學習借鑒制作學生管理系統(tǒng),感興趣的小伙伴們可以參考一下2015-12-12
Android Studio 3.6 調(diào)試 smali的全過程
這篇文章主要介紹了Android Studio 3.6 調(diào)試 smali, 目前最新版的 Android Studio 利用附加功能調(diào)試 smali 非常方便,具體操作步驟跟隨小編一起看看吧2020-02-02
Android onTouchEvent事件中onTouch方法返回值(介紹)
下面小編就為大家?guī)硪黄狝ndroid onTouchEvent事件中onTouch方法返回值(介紹)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Android Animation之TranslateAnimation(平移動畫)
這篇文章主要為大家詳細介紹了Animation之TranslateAnimation平移動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
Android?IdleHandler基本使用及應用案例詳解
這篇文章主要為大家詳細介紹了Android?IdleHandler的基本使用及應用案例,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以參考一下2022-10-10
Android 實現(xiàn)監(jiān)聽的四種方法詳解實例代碼
這篇文章主要介紹了Android 實現(xiàn)監(jiān)聽的方法詳解實例代碼的相關資料,這里整理了四種方法,需要的朋友可以參考下2016-10-10

