안 드 로 이 드 360 가속 구 메모리 방출 실현
핸드폰 은 주파수 캡 처 만 있 기 때문에 다음 그림 과 같다.오픈 단 추 를 누 르 면 현탁 창 작은 공 컨트롤 에 핸드폰 의 사용 가능 한 메모리 백분율 을 표시 합 니 다.작은 공 을 끌 때 작은 공 은 Android 아이콘 으로 변 합 니 다.작은 공 을 풀 고 작은 공 은 주파수 막 양쪽 에 붙 어 있다.작은 공 을 클릭 하면 핸드폰 밑 에 큰 창 컨트롤 이 나타 나 고 안의 작은 공 을 클릭 하여 핸드폰 메모리 의 방출 을 한다.휴대 전화 화면의 다른 구역 을 클릭 하면 큰 창문 이 사라 지고 작은 공이 다시 나타난다.
효 과 는 다음 과 같 습 니 다:
다음은 실현 의 중요 한 절차 이다.
1.Float CircleView 의 실현(사용자 정의 view)
Float Circle View 를 실현 하 는 과정 은 사용자 정의 view 의 과정 입 니 다.1.사용자 정의 View 의 속성 2.View 의 구조 방법 에서 사용자 정의 속성 3 을 얻 고 onMesure 4 를 다시 쓰 며 onDraw 를 다시 씁 니 다.우 리 는 다른 속성 을 사용자 정의 하지 않 아서 많은 절 차 를 절약 했다.
각종 변수의 초기 화,작은 공 을 끌 때 표시 할 아이콘 을 설정 하고,각종 메모 리 를 계 산 했 습 니 다.(작은 공 에 보이 기)
public int width=100;
public int heigth=100;
private Paint circlePaint;//
private Paint textPaint; //
private float availMemory; //
private float totalMemory; //
private String text; //
private boolean isDraging=false; // 。
private Bitmap src;
private Bitmap scaledBitmap; // 。
/**
* , , 。
*/
public void initPatints() {
circlePaint = new Paint();
circlePaint.setColor(Color.CYAN);
circlePaint.setAntiAlias(true);
textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(25);
textPaint.setFakeBoldText(true);
textPaint.setAntiAlias(true);
//
src = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
// ( 。)
scaledBitmap = Bitmap.createScaledBitmap(src, width, heigth, true);
// , , ,
availMemory= (float) getAvailMemory(getContext());
totalMemory= (float) getTotalMemory(getContext());
text=(int)((availMemory/totalMemory)*100)+"%";
}
onMeasure();고정 적 인 너비 와 높이 를 set Measured Dimension(width,heigth)을 통 해 죽 이 는 것 입 니 다.전래onDraw();플 로 팅 볼 그리 기.boolean 변 수 를 정의 하여 현재 상태 가 작은 공 을 끌 어 당 기 는 상태 인지 판단 합 니 다.작은 공 을 끌 어 당 기 는 상태 라면 이 위치 에 안 드 로 이 드 아이콘 을 그립 니 다.드래그 상태 가 아니라면 작은 공 을 그립 니 다.작은 공 을 그 리 는 데 는 난이도 가 없고,관건 은 글 씨 를 그 리 는 것 이다.아래 의 두 그림 은 글 자 를 그 릴 때의 이 해 를 깊이 있 게 할 수 있다.
1.글 자 를 그 릴 때의 x 좌표(1.textPaint.measureText(text);글자 의 너비 얻 기 2.작은 공의 너비/2-글자 의 너비/2.)
2.글 자 를 그 릴 때의 y 좌표(1.Paint.FontMetrics fontMetrics=textPaint.getFontMetrics();글꼴 속성 측정 류 를 가 져 옵 니 다.2.(fontMetrics.ascent+fontMetrics.descent)/2 글자 의 높이 를 얻는다.3.작은 공의 높이/2-글씨체 의 높이/2)
그림 을 그리 면 이해 하기 쉽다.
/**
* 。 android , 。
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
if (isDraging){
canvas.drawBitmap(scaledBitmap,0,0,null);
}else {
//1.
canvas.drawCircle(width / 2, heigth / 2, width / 2, circlePaint);
//2. text
float textwidth = textPaint.measureText(text);//
float x = width / 2 - textwidth / 2;
Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
float dy = -(fontMetrics.ascent + fontMetrics.descent) / 2;
float y = heigth / 2 + dy;
canvas.drawText(text, x, y, textPaint);
}
}
핸드폰 에 사 용 된 메모리 와 총 메모 리 를 가 져 오 는 방법:
public long getAvailMemory(Context context)
{
// android
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
am.getMemoryInfo(mi);
//mi.availMem;
//return Formatter.formatFileSize(context, mi.availMem);//
return mi.availMem/(1024*1024);
}
public long getTotalMemory(Context context)
{
String str1 = "/proc/meminfo";//
String str2;
String[] arrayOfString;
long initial_memory = 0;
try
{
FileReader localFileReader = new FileReader(str1);
BufferedReader localBufferedReader = new BufferedReader(
localFileReader, 8192);
str2 = localBufferedReader.readLine();// meminfo ,
arrayOfString = str2.split("\\s+");
for (String num : arrayOfString) {
Log.i(str2, num + "\t");
}
initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// , KB, 1024 Byte
localBufferedReader.close();
} catch (IOException e) {
}
//return Formatter.formatFileSize(context, initial_memory);// Byte KB MB,
return initial_memory/(1024*1024);
}
2.Window Manager 창 관리 류 를 만 들 고 현탁 구 와 아래쪽 큰 창 을 관리 합 니 다.Window Manager 클래스.전체 부유 공 과 휴대 전화 밑 에 있 는 큰 창문 의 표시 와 숨 김 을 관리 하 는 데 사용 된다.
Manifest 파일 에
WindowManager wm=(WindowManager)getSystem Service(Context.WINDOWSERVICE);창 관리 클래스 가 져 오기;
wm.addView(view,params)를 이용 하기;view 를 창 에 추가 합 니 다.
wm.remove(view,params)를 이용 하기;view 를 창 에서 제거 합 니 다.
wm.updateViewLayout(view,params)를 이용 합 니 다.view 를 업데이트 합 니 다.
Window Manager.LayoutParams 는 view 의 다양한 속성 을 설정 합 니 다.
1.FloatViewManager 인 스 턴 스 를 만 듭 니 다.
//
public static FloatViewManager getInstance(Context context){
if (inStance==null){
synchronized(FloatViewManager.class){
if (inStance==null){
inStance=new FloatViewManager(context);
}
}
}
return inStance;
}
2.작은 공 을 띄 우 고 아래쪽 창 을 보 여 주 는 방법.(창 을 보 여 주 는 방법 은 부유 구 를 보 여 주 는 것 과 유사 하 다.)
/**
*
*/
public void showFloatCircleView(){
//
if (params==null){
params = new WindowManager.LayoutParams();
//
params.width=circleView.width;
params.height=circleView.heigth;
//
params.gravity= Gravity.TOP|Gravity.LEFT;
//
params.x=0;
params.y=0;
//
params.type=WindowManager.LayoutParams.TYPE_TOAST;
// window 。
params.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
//
params.format= PixelFormat.RGBA_8888;
}
// 。
wm.addView(circleView, params);
}
public void showFloatCircleView(){
......
}
3.프로그램 을 시작 하면 먼저 플 로 팅 볼 을 만 들 고 작은 공 은 끌 어 당 길 수 있 으 며 작은 공 을 클릭 하면 핸드폰 밑 에 있 는 창 표시(FloatMenuView),작은 공 은 숨 길 수 있 습 니 다.따라서 작은 공(circle View)에 대해 서 는 setOnTouch Listener 와 setOnClickListener 사건 을 감청 해 야 합 니 다.작은 공의 사건 배포 분석 하기;작은 공 에 대해:
ACTION다운 시,작은 공 을 기록 한 다운 X,다운 Y,그리고 startX,startY,
ACTIONMOVE 에 서 는 circle View 가 끌 리 는 상 태 를 true 로 설정 하고 작은 공의 moveX,moveY 를 기록 하 며 작은 공의 이동 거리(dx,dy)를 계산 한 다음 wm.updateViewLayout(circle View,params)에 따라작은 공의 위 치 를 갱신 하 다.마지막 으로 마지막 move 의 좌 표를 startX,startY 에 할당 합 니 다.
ACTIONUP 시 circle View 를 false 로 끌 어 올 릴 지 여 부 를 기록 합 니 다.들 어 올 릴 때의 좌표,upx 는 upx 와 핸드폰 화면 너비/2 에 따라 최종 작은 공이 화면 왼쪽 에 붙 었 는 지 오른쪽 에 붙 었 는 지 판단 합 니 다.뒤쪽 이 작은 공 을 끌 어 당 기 는 오차.작은 공이 끌 어 당 기 는 거리 가 10 픽 셀 보다 작 을 때 작은 공의 클릭 이 벤트 를 촉발 할 수 있 습 니 다.(작은 공의 터치 이 벤트 는 작은 공의 클릭 이벤트 보다 우선 합 니 다.터치 이벤트 가 트 루 로 돌아 갈 때 이 이 벤트 는 소비 되 어 이 벤트 를 아래로 전달 하지 않 습 니 다.Touch 이벤트 가 false 로 돌아 갈 때 이 이 벤트 는 계속 아래로 전달 되 어 작은 공의 클릭 이 벤트 를 촉발 합 니 다.)
작은 공의 클릭 이벤트:작은 공 을 클릭 하고 작은 공 을 띄 워 숨 기 며 핸드폰 밑 에 창문 이 나타 납 니 다.아래쪽 창 이 나타 날 때의 과도 애니메이션 을 설정 합 니 다.
// circleView touch 。
private View.OnTouchListener circleViewOnTouchListener=new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// , ACTION_MOVE 。
startX = event.getRawX();
startY = event.getRawY();
// 。
downX = event.getRawX();
downY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
circleView.setDrageState(true);
moveX = event.getRawX();
moveY=event.getRawY();
float dx = moveX -startX;
float dy=moveY-startY;
params.x+=dx;
params.y+=dy;
wm.updateViewLayout(circleView,params);
startX= moveX;
startY=moveY;
break;
case MotionEvent.ACTION_UP:
float upx=event.getRawX();
if (upx>getScreenWidth()/2){
params.x=getScreenWidth()-circleView.width;
}else {
params.x=0;
}
circleView.setDrageState(false);
wm.updateViewLayout(circleView,params);
if (Math.abs(moveX-downX)>10){
return true;
}else {
return false;
}
default:
break;
}
return false;
}
};
circleView.setOnTouchListener(circleViewOnTouchListener);
circleView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(, "onclick", Toast.LENGTH_SHORT).show();
//[ circleView,@ 。
wm.removeView(circleView);
showFloatMenuView();
floatMenuView.startAnimation();
}
});
3.MyProgreeView.1.붓 을 초기 화하 고 view 를 손짓 으로 감청 한다.클릭 과 이 벤트 를 더 블 클릭 합 니 다.(클릭 할 수 있 는 view 를 설정 해 야 합 니 다)
private void initPaint() {
//
circlepaint = new Paint();
circlepaint.setColor(Color.argb(0xff, 0x3a, 0x8c, 0x6c));
circlepaint.setAntiAlias(true);
//
progerssPaint = new Paint();
progerssPaint.setAntiAlias(true);
progerssPaint.setColor(Color.argb(0xff, 0x4e, 0xcc, 0x66));
progerssPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//
//
textPaint = new Paint();
textPaint.setAntiAlias(true);
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(25);
//
bitmap = Bitmap.createBitmap(width, heigth, Bitmap.Config.ARGB_8888);
bitmapCanvas = new Canvas(bitmap);
// 。
gestureDetector = new GestureDetector(new MyGertureDetectorListener());
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
// view 。
setClickable(true);
}
class MyGertureDetectorListener extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onDoubleTap(MotionEvent e) {
......
//
return super.onDoubleTap(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
......
//
return super.onSingleTapConfirmed(e);
}
}
2.handler 상호작용 으로 클릭 과 더 블 클릭 이벤트 의 상태 업 데 이 트 를 진행 합 니 다.클릭 시 베 세 르 곡선 을 이용 하여 파문 출 렁 이 는 효 과 를 실현 합 니 다.더 블 클릭 시 파문 이 계속 떨 어 지고 메모리 방출 을 진행 하 며 마지막 으로 메모리 방출 후의 사용 한 메모리 백분율 을 표시 합 니 다.handler 는 주기 적 인 메 시 지 를 보 내 이벤트 와 더 블 클릭 이벤트 의 작은 공 을 계속 다시 그립 니 다.(다음 소절 에 다시 그리다.
// handler.
private void startSingleTapAnimation() {
handler.postDelayed(singleTapRunnable,200);
}
private SingleTapRunnable singleTapRunnable=new SingleTapRunnable();
class SingleTapRunnable implements Runnable{
@Override
public void run() {
count--;
if (count>=0) {
invalidate();// 。
handler.postDelayed(singleTapRunnable,200);
}else {
handler.removeCallbacks(singleTapRunnable);
count=50;
}
}
}
// handler。
private void startDoubleTapAnimation() {
handler.postDelayed(runnbale,50);
}
private DoubleTapRunnable runnbale=new DoubleTapRunnable();
class DoubleTapRunnable implements Runnable{
@Override
public void run() {
num--;
if (num>=0){
invalidate();// 。
handler.postDelayed(runnbale,50);
}else {
handler.removeCallbacks(runnbale);
// 。
killprocess();
// 。
num=(int)(((float)currentProgress/max)*100);
}
}
}
3.이벤트 와 이 벤트 를 두 번 눌 러 서 다시 그립 니 다.
, 。
//
bitmapCanvas.drawCircle(width / 2, heigth / 2, width / 2, circlepaint);
// path, 。 path,reset.
path.reset();
float y =(1-(float)num/100)*heigth;
path.moveTo(width, y);
path.lineTo(width, heigth);
path.lineTo(0, heigth);
path.lineTo(0, y);
이 어 베 세 르 곡선 을 이용 해 파문 경 로 를 그 렸 다.안 드 로 이 드-베 세 르 곡선
베 세 르 곡선 이 안 드 로 이 드 에서 의 응용
여기 베 세 르 곡선 에 대한 상세 한 설명 이 있 습 니 다.사실 깊이 이해 할 필요 가 없다.그것 으로 물결 무늬 효 과 를 실현 할 수 있다 는 것 만 알 면 된다.주로 path.rQuadto(x1,y1,x2,y2)를 이용 합 니 다.종점(x2,y2),보조 제어점(x1,y1)의 베 세 르 곡선.따라서 y1 의 위 치 를 계속 바 꾸 면 우 리 는 물결 무늬 의 효 과 를 그 릴 수 있다.
우선 더 블 클릭 이벤트 인지 여 부 를 판단 합 니 다.
더 블 클릭:변 수 를 설정 하면 d 의 값(d 의 값 변 화 는 num 에 의 해 발생 하고 num 실제 handler 에서 계속 줄 어 듭 니 다.numC;),베 어 셀 곡선 을 그립 니 다.물결 무늬 의 하강 효 과 를 실현 하 다.
누 르 면:count 값 을 설정 하고 count 값 을 계속 변경 합 니 다(count 값 의 변 화 는 handler 에서 이 루어 집 니 다.countC;),먼저 count 가 2 로 나 눌 수 있 는 지 판단 하고 이 두 개의 베 세 르 곡선 을 교체 해서 그립 니 다.(이 두 개의 베 세 르 곡선 은 정반 대 이다).이로써 물결 이 출 렁 이 는 효 과 를 실현 한다.
(for 순환 은 물결 을 실현 하 는 파수 이 고 path.rQuadto()한 쌍 입 니 다.한 번 의 파문 만 이 루어 질 수 있다.스스로 검증 할 수 있다)
if (!isSingleTap){
float d=(1-(float)num/(100/2))*10;
for (int i=0;i<3;i++){
path.rQuadTo(10,-d,20,0);
path.rQuadTo(10,d,20,0);
}
}else {
float d=(float)count/50*10;
if (count%2==0){
for (int i=0;i<=3;i++){
path.rQuadTo(10,-d,30,0);
path.rQuadTo(10,d,30,0);
}
}else {
for (int i=0;i<=3;i++){
path.rQuadTo(10,d,30,0);
path.rQuadTo(10,-d,30,0);
}
}
}
마지막 으로 메모리 방출 방법 입 니 다.Manifest 파일 에
public void killprocess(){
ActivityManager activityManger=(ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> list=activityManger.getRunningAppProcesses();
if(list!=null)
for(int i=0;i<list.size();i++)
{
ActivityManager.RunningAppProcessInfo apinfo=list.get(i);
String[] pkgList=apinfo.pkgList;
if(apinfo.importance>ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE)
{
// Process.killProcess(apinfo.pid);
for(int j=0;j<pkgList.length;j++) {
boolean flag=pkgList[j].contains("com.example.yyh.animation360");// , 。
if(!flag){
activityManger.killBackgroundProcesses(pkgList[j]);
}
}
}
}
4.Float Menu View 의 실현.1.float 만 들 기menuview.xml;ImageView+TextView+사용자 정의 MyProgreeView 가 포함 되 어 있 습 니 다.
아래쪽 창 을 클릭 할 수 있 도록 설정 해 야 합 니 다.android:clickable="true";
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#33000000"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#F02F3942"
android:layout_alignParentBottom="true"
android:id="@+id/ll"
android:clickable="true"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_launcher"
android:layout_gravity="center_vertical"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="#c93944"
android:text="360 "
android:layout_gravity="center_vertical"
/>
</LinearLayout>
<com.example.yyh.animation360.view.MyProgreeView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
/>
</LinearLayout>
</RelativeLayout>
2.FloatMenuView 를 조건 에 따라 이용 하기(wm.addView(view,params);view 를 창 에 추가 합 니 다.wm.remove(view,params)를 이용 하기;view 를 창 에서 제거 합 니 다.)방법,아래쪽 창 view 의 표시 와 숨 기기
TranslateAnimation 클래스 는 아래쪽 창 이 들 어 갈 때의 애니메이션 효 과 를 설정 합 니 다.TranslateAnimation(int fromXType,float fromXValue,int toXType,float toXValue,int fromYType,float fromYValue,int toYType,float toYValue)
int from XType:x 축 방향 에서 시작 하 는 참조 값 은 세 가지 옵션 이 있 습 니 다.(1.Animation.ABSOLUTE:구체 적 인 좌표 값 은 절대적 인 화면 픽 셀 단 위 를 가리킨다.
2.Animation.RELATIVE_TO_SELF:자신의 좌표 값 에 상대 합 니 다.3.Animation.RELATIVE_TO_PARENT:부모 용기 에 대한 좌표 값 입 니 다.)
float from Xvalue 두 번 째 매개 변 수 는 첫 번 째 매개 변수 형식의 시작 값 입 니 다(예 를 들 어 첫 번 째 매개 변 수 는 Animation.RELATIVE 로 설정 되 어 있 습 니 다.TO_SELF,두 번 째 매개 변 수 는 0.1f 로 자신의 좌표 값 에 0.1 을 곱 하 는 것 을 나타 낸다.
int toXType:x 축 방향 종점 의 참조 값 은 세 개의 옵션 이 첫 번 째 매개 변수 와 같 습 니 다.
float toValue:네 번 째 매개 변 수 는 세 번 째 매개 변수 형식의 시작 값 입 니 다.
Y 축 방향의 매개 변 수 는 같 습 니 다.시작+끝 점;(매개 매개 변수 뒤의 매개 변 수 는 이전 매개 변수의 시작 값 입 니 다.)
그리고 이 view 에 OnTouch Listener 를 설정 합 니 다.OnTouch 사건 은 마지막 으로 false 로 돌아 가 야 합 니 다.이 사건 은 여전히 아래로 전달 되 어야 한 다 는 뜻 입 니 다.따라서 핸드폰 의 다른 구역 을 클릭 할 때 핸드폰 밑 에 있 는 창 이 숨 어 있 고 떠 있 는 작은 공 은 바닥 창 을 클릭 할 때 변화 가 없 으 며 바닥 창 에 있 는 작은 공 을 클릭 할 때 클릭 과 더 블 클릭 이 벤트 를 촉발 합 니 다.
View view =View.inflate(getContext(), R.layout.float_menuview,null);
LinearLayout linearLayout= (LinearLayout) view.findViewById(R.id.ll);
translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1.0f,Animation.RELATIVE_TO_SELF,0);
translateAnimation.setDuration(500);
translateAnimation.setFillAfter(true);
linearLayout.setAnimation(translateAnimation);
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
FloatViewManager manager=FloatViewManager.getInstance(getContext());
manager.hideFloatMenuView();
manager.showFloatCircleView();
return false;
}
});
addView(view);
5.MyFloatServiceFloat VIEwManager 를 만 드 는 데 사용 되 며,부유 구+핸드폰 아래쪽 창의 생 성과 제 거 를 관리 합 니 다.
public class MyFloatService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
// FloatViewManager
FloatViewManager manager=FloatViewManager.getInstance(this);
manager.showFloatCircleView();
super.onCreate();
}
}
6.MainActivity 의 실현intent 를 정의 하고 서 비 스 를 시작 합 니 다.(서비스 에서 WindowManager 단일 대상 을 만 들 고 플 로 팅 볼 과 핸드폰 아래쪽 창 을 관리 합 니 다.)현재 activity 를 닫 습 니 다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startService(View view){
Intent intent=new Intent(this, MyFloatService.class);
startService(intent);
finish();
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.