728x90
반응형

출퇴근용으로 집에서 지하철역까지 가기 위해서 자전거가 필요 하게 되었네요.

정말 무수한 고민끝에 MTB를 구매 하였습니다.

 

전기자전거, 미니벨로, MTB까지 정말 엄청엄청 고민했습니다.

개인적으로 자전거 타는거를 좋아해서 운동도 겸할겸 해서 MTB가 가장 최적이여서 구매 하였네요.

 

오반장 바이시클에서 구매를 하였고 이전에 몇번 네이버톡을 통해서 질문을 하였습니다.

최종적으로 미니벨로와 MTB중에 고민을 하였고 몸무게도 있고해서...-_-;; ..

 

먼저 배송도 굉장히 빨랐고, 최종 주문후 3일만에 도착한거 같습니다.

넉넉한 사은품까지 와서 좋았어요!

 

참고로 저는 키는 180cm / 90kg이여서 L사이즈로 구매 하였습니다. 원하는 색상이 XL에 있었지만.. 포기 ㅠㅠ

 

이렇게 어마어마 하게큰 박스가...ㅋㅋ

 

 혹시 모르니 조심조심 칼로 잘랐습니다. 괜히 깊게 자르면 내부 자전거가 손상될거 같아서 ...  

 

 

참고로 조립은 매우 쉬웠어요.

1. 핸들조립

2. 패달조립

3. 안장설치

 

이 세개만 하면 끝납니다!! 안장은 자세헤 따라서 잘 조절해주세요

 

 

 

짜잔~ 최종 완성입니다.

 

생각보다 큰거 같았고. 제가 예전에 탔던 사브 자전거 보다 뭔가 더 큰느낌이고 . 그리고 브레이크나 서스펜션은 확실히 요즘 자전거가 좋더라구요!! 

 

이렇게 사은품을 주셨고.. 아쉽게 사진은 못찍었지만 헬멧도!! 주셨어용

헬멧 정말 생각보다 좋은걸 주셨고 뒤에 불도 나오네요 ㅎㅎㅎ 좋아요

 

워낙에 오랜만에 자전거를 타는거라서 주말에 익숙해지도록 하고 출퇴용으로 일단 시작 후 운동도 같이 하려고 합니다.

아 그리고 무게는 14키로정도인데 개인적으로 가볍다고 생각했습니다!

 

그럼 자전거 구매 하실분들 참고하시고 즐거운 라이딩도 하세요.

 

 

728x90
728x90
반응형

안녕하세요.

오늘은 스마트폰 용량을 줄이는 방법중 한가지 방법을 소개 하려고 합니다.

사진첩에 있는 사진이나 동영상을 없애기 아까운데 용량은 부족할때가 있습니다.

그때 그나마 효율적인 방법으로 용량을 확보 하는 방법을 소개 할게요.

 

카카오톡에 다운로드 받은 사진이나 동영상을 제거 하면 용량을 꽤 확보 가능합니다.

 

생각보다 지인들을 통해서 전달 받는 사진이나 동영상이 꽤 되요. 해당 내용을 다운로드 받아도 따로 카카오톡 대화방에는 해당 파일이 남겨 있습니다.

 

다운로드 받은 후에 카카오톡방에 있는 사진과 동영상을 제거 하면 됩니다. 제거 하지 않으면 이중으로 다운받은 격이 되버리거든요.

 

순서 대로 따라해보세요!

 

먼저, 단톡 또는 개인톡방을 들어 갑니다.

그러면 화면에 빨간 상자로 표시한 부분을 터치하세요.

 

그리고 위 화면이 나오면 역시 빨간색 상자로 표시 되어 있는 "톱니바퀴"를 터치 하세요!!

 

그러면 채팅방 설정 화면이 나오는데. 맨 아래로 스크롤 해주세요!

 

자! 여기입니다. 보시면 사진과 동영상 파일의용량이 표시 되어 있어요. 해당 부분들을 삭제 하면 그 만큼의 용량을 확보 하는거에요.

 

전체 삭제 할거면 "전체 파일 모두 삭제"를 누르고, 사진만 할건지 혹은 동영상만 삭제 할거면 삭제 하고싶은 부분을 삭제 하시면 됩니다.

 

 

 

위 처럼 나오면 모두 삭제 버튼을 누르시면 됩니다.

 

그럼 짜잔~ 모두 삭제가 되면서 용량이 확보 되었어요.

참고로 저부분을 삭제 한다고 이미 내 사진첩에 저장되어 있는 파일이 삭제 되진 않습니다.

그리고 지인들이 보내준 사진이나 동영상을 클릭할때 다운로드가 되는 것이니 필요 없는 것은 굳이 터치해서 다운로드 하실필요 없습니다.

 

그럼 다음에는 또 다른 방법으로 용량을 확보 하는 방법을 알려 드릴게요!

 

모두 즐겁고 유익하게 스마트폰을 활용해봐요!!

728x90
728x90
반응형

친구와 둘이 오랜만에 바다로 여행을 다녀왔습니다.

이곳은 평소에도 일년에 2~3번 꼭가는 곳이고 친구 이외에도 가족들과도 가는 곳입니다.

조용한곳을 워낙 좋아해서 자주 찾는 곳이 되었네요!!

그곳은 강원도 고성에 있는 청간해변!!

다른곳에 비해서는 작은 해안가이지만 모래 알갱이가 크기 때문에 모래가 묻어도 털어내기도 편합니다.

8월18일 퇴근 후 금요일 저녁에 출발을 하였습니다.!!

출발직전 찍는걸 깜빡 ㅠㅠ

생각나서 바로 T-MAP의 아리아에게 빨리 캡쳐해달라고 부탁!

저녁에 출발하면 막히지 않기 때문에~~ 고고

2시간이 살짝 넘은 시간에 도착하더군요!

경기도 남양주시에서는 서해보다는 동해가 가기 훨씬 편해졌습니다.

아무래도 양양고속도로가 뚫리면서..확실히 편해졌어요!

달리고 달려서~~~

드디어 도착 하였습니다.

이번에는 차박이지만 차박텐트 없이..그냥 이렇게 ㅎㅎ

라면과 + 쥐포를 안주 삼아 맥주를 꿀꺽 마셨습니다.

다음날을 위해서 차에서 취침!! 참고로 여기는 주차 무료입니다!!

이렇게 사람이 없네요.. ㅎㅎㅎ

그래도 점심쯤되니 저기 사진에 보이는 테이블들은 전부 사용중으로 바뀝니다!!

또한 사진에 보이듯이 모래도 알갱이가 크다보니깐 나름 괜찮아요!!

열심히 물에서 놀고! 생각보다 춥지 않아요.

다만 물이 깊은곳이 있으니 항상 조심해야 하고 무조건 구명조끼 착용은 필수랍니다.

저녁은 간단히 고기와!! 맥주!!

다음날 일요일에는 일찍 약속이 있어서 새벽에 급 출발 하였습니다.

정리하고 보니 5시에 출발하게되었어요.

2시간10분정도 걸리네요!!

잘놀다왔습니다.

장/단점을 한번 정리 해볼게요.

장점

  1. 주차 무료
  2. 화장실 365일24시간 오픈!!
  3. 근처가 조용함
  4. 근처 유명 해수욕장이 많음 ( 아야진/봉포 등등 )

단점

  1. 주차장이 작음
  2. 근처에 맛집이 없음.

그럼 이만!! 모두 언제나 즐거운 휴가 및 연휴 되세요

 

728x90
728x90
반응형

현재 설정 관련 레이아웃을 만들다가 표시해주는 상자를 곡선으로 그리고 싶었다.

아무래도 더 이쁘기도 하고 벤치마킹하는 유튜브나 다른 플레이어들도 코너를 많이 적용 했기 때문이다.

 

먼저. 나는 constraintLayout을 사용하는데 이 contraintLayout에 corner를 적용하고 싶다.

먼저 일반적으로 사용 할때.. 이렇게 사용 하였음.

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="@dimen/_180sdp"
        android:layout_height="wrap_content"
        android:background="#212121"
        android:visibility="visible"
        android:layout_marginBottom="@dimen/_10sdp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent">
        
        <TextView
           ......
        />
</androidx.constraintlayout.widget.ConstraintLayout>

자 이런식으로 한 후에 실행을 시키면 단순히 네모난 모양으로 출력이 된다.

나는 네모난 모양을 곡선으로 변경하고 싶을때 다음과 같이 사용 하였다.

 

view_card.xml

<?xml version="1.0" encoding="utf-8"?><!-- 다이얼로그 배경 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="10dp" />
    <solid android:color="#383838" />
</shape>

위에 내용은 corner를 그려주는 레이아웃이다. 이 레이아웃을 contraintLayout에 background에 적용하면된다.

여기서 참고 할 것은. view_card.xml은. drawable아래에 생성을 해주어야한다!!!

 

아래와 같이 적용하면 이제 네모가 아닌 코너가 만들어진 상태로 화면에 보여준다.

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="@dimen/_180sdp"
        android:layout_height="wrap_content"
        android:background="@drawable/view_card"
        android:visibility="visible"
        android:layout_marginBottom="@dimen/_10sdp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent">
        
        <TextView
           ......
        />
</androidx.constraintlayout.widget.ConstraintLayout>

constraintLayout에 background="#212121" -> @drawable/view_card 로 변경하면 끝!

728x90
728x90
반응형

코틀린을 사용하다 보면 random함수가 필요한 경우가 종종 있다.

그래서 랜덤함수의 사용방법을 기록해보기로 한다.

 

1. random()

fun main() {
	val range = (0..45)
    
    println(range.random())
    println(range.random())
}

결과 .

0 부터 45까지의 랜덤한 함수가 출력되었다.

총 6개의 랜덤함수를 만들어 보자.

fun main() {
	val range = (0..45) 
    var cnt = 0
    
    while(cnt < 6) {
        print(range.random()  )    
        print(" ")
        cnt++
    }   
}

 

0 부터 45번까지 총 6개의 데이터를 생성 하여 나열하였다.

 

위 내용은 정해진 패턴으로 랜덤 숫자를 생성한다. 그래서 매번 처음 동작 시킬때마다 같은 숫자대역이 나올확률이 있다.

이러한 정해진 패턴을 무시하는 랜덤함수를 사용하자.

 

2. SecureRandom

fun main() {
	val range = SecureRandom()
    println(range.nextInt(45))  
 
}

nextInt(45)는 0부터 45까지의 랜덤숫자를 출력 하도록 설정 한다.

 

똑같이 1번내용 처럼 살짝 응용을 하면 원하는 개수를 지정 할수 있고, 중복되지 않다던지, 특정 숫자를 제외 한다던지의 내용을 추가하여 구현 할수있다.

 

상황에 따라 다르지만 되도록이면 secureRange를 사용하는게 좋을 것 같ㄷ.

728x90
728x90
반응형

추가 기능을 만들려고 하는데, Youtube나 네이버 동영상 등 여러가지 동영상 플랫폼에서 지원하는 기능이다.

맨처음에 기능의 이름을 몰라서 여러가지로 검색을 해보았는데 해당 기능의 이름은 PIP라고 부른다.

 

간단한 예제를 먼저 소개를 하고 추후에 기능을 추가할 예정이다.

 

구현 순서.

1. 설정 : 매니페스트 수정. ( AndroidManifest.xml )

<activity
  ......
  android:resizeableActivity="true"
  android:supportsPictureInPicture="true"
  ......
/activity>

매니페스트에 위 두개를 추가 한다.

 

2. xml 수정

기본생성된 내용을 수정한다.

<VideoView
        android:id="@+id/main_video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <Button
            android:id="@+id/main_pip_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Start PIP mode"
            android:backgroundTint="@android:color/holo_orange_light"
            />
    </ScrollView>

 

3. 코드 수정.

class MainActivity : AppCompatActivity() {
    private val mPipBuilder = PictureInPictureParams.Builder()
    private lateinit var binding : ActivityMainBinding
    private val TAG = "PIP"

    override fun onCreate(savedInstanceState: Bundle?) {
        Log.d(TAG, "[power cycle] onCreate")
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.mainVideoView.run {
            //영상이 끝나면 영상을 재시작해서 무한반복 시킴.
            setOnCompletionListener {
                it.start()
            }

            //res폴더에 있는 비디오를 비디오뷰에 set시켜준다.
            setVideoURI(Uri.parse("android.resource://$packageName/${R.raw.sample}"))
            start()
        }

        binding.mainPipBtn.setOnClickListener {
            mPipBuilder.setAspectRatio(Rational(binding.mainVideoView.width, binding.mainVideoView.height))
            enterPictureInPictureMode(mPipBuilder.build())
        }
    }
}

 

4. 결과 화면

START PIP MODE를 클릭하면 오른쪽 사진처럼 화면이 작아짐을 볼수있다.

 

추후에 화면이 작아졌을 경우 재생버튼등의 layout등을 표시하고 그에 따른 기능을 구현하는 예제를 추가로 만들어 볼 예정이다. 

728x90
728x90
반응형

안녕하세요.

이번에 안드로이드 개발을 시작하면서 미들웨어의 함수를 호출해야 하는 일이 생겼습니다.

백그라운드는 전부 C++코드이기 때문에 직접 호출이 필요한 경우가 있습니다.

간단하게 호출하는 방법을 소개 하려고 합니다.

 

1. 코드 이름 및 종류

- exam.kt, mw.cpp

 

2. 간단한 소스 

exam.kt

extern fun testNativeCode()

fun call() {
	testNativeCode
}

여기서 위 내용처럼 하면 Android studio에서 native code를 생성 할 것인지 묻는다.
그때 만들어질 위치를 선택해주면 자동으로 생성 한다.

 

mw.cpp

#include "exam.h"

extern "C"
JNIEXPORT void JNICALL
Java_com_mobipintech_zui_MobileMainDialog_testNativeCode(JNIEnv *env, jobject thiz) {
    // TODO: implement at3NativeTestFunc()
    at3NativeTestFunc();
}

위 내용은 Java_com_mobipintech_zui_MobileMainDialog까지는 경로.
TestNativeCode는 함수 이름이다.

 

exam.cpp

void atNativeTestFunc()
{
	printf("TEST 코드 입니다.\n")
}

 

exam.h

void atNativeTestFunc();

 

이렇게 사용할 내용을 c++에 정의 해놓고 코틀린 내부에서 호출해서 직접 사용 하면 됩니다.

 

728x90
728x90
반응형

이번에 안드로이드 앱 개발이 필요하여 공부를 진행 하면서 개발을 동시에 진행해야 한다.

그래서 공부한 내용을 블로그에 추가로 정리를 한다.

 

1. 화면 크기 : 화면의 물리적인 크기, 화면의 대각선 크기로 지정.
예) 보통화면 : 최소 470dp X 320dp

 

2. 화면 밀도 : 물리적 화면 공간 안에 있는 픽셀의 개수, 일반적으로 dpi ( dot per inch )

예) hdpi ( 고밀도 ) ~ 240dpi

3. 해상도 : 화면에 있는 물리적 픽셀의 총개수, 예로 2천만 화소로 부른다.

 in : 인치, 기반의 물리적 스크린 크기.

 mm : 밀리미터, 기반의 물리적 스크린 크기

 px : 스크린상의 실제 픽셀에 대응 하는 단위

 dp : 밀도 독립적 픽셀

 px : dp * ( dpi / 160 )

 sp : 텍스트 크기를 정의

 pt : 화면 밀도와 상관 없이 1pt는 물리적 화면 크기의 1/72인치이다.

 

 ps) 안드로이드 기기는 많은 업체에서 제작되고 화면의 크기 및 해상도 천차만별이다. 이런 서로 다른 크기와 화면밀도, 해상도를 가진 기기들에서 같은 모양의 UI를 제공하기 위해서는 dp를 사용한다.

728x90

+ Recent posts