반응형

1.MotionLayout 이란? 

 

모션과 위젯 애니메이션을 관리하는 사용할 수 있는 레이아웃 유형 이다.

MotionLayout은 ConstraintLayout 서브 클래스 이다. 

 

2 . MotionLayout 을 사용해서 얻는 이점 

 

  2-1. MotionLayout은 레이아웃 전환과 복잡한 모션 처리 사이를 연결하며 속성 애니메이션 프레임워크 ,   TransitionManager 및    CoordinatorLayout 사이의 혼합된 기능을 제공한다. 

 

  2-2. MotionLayout을 사용하여 레이아웃 속성을 애니메이션으로 보여줄수있다.

검색 가능 전환 ? 을 지원한다. ( 터치 입력과 같은 일부 조건에 따라 전환 내의 포인트를 즉시  표시. )

키프레임도 지원 하므로 사용자의 필요에 맞게 완전히 맞춤설정된 전환을 사용. 

 

*키프레임 :  시작 시간과 종료 시간을 지정하고 그 사이에 움직임과 같은 효과를 넣는 작업

 

  2-3. MotionLayout은 완전히 선언 가능하므로, 복잡도에 상관없이 XML로 모든 전환을 설명할 수 있습니다.

 

 

3. MotionLayout을 분석해보자. 

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:motion="http://schemas.android.com/apk/res-auto">

        <Transition
            motion:constraintSetStart="@+id/start"
            motion:constraintSetEnd="@+id/end"
            motion:duration="1000">
            <OnSwipe
                motion:touchAnchorId="@+id/button"
                motion:touchAnchorSide="right"
                motion:dragDirection="dragRight" />
        </Transition>

        <ConstraintSet android:id="@+id/start">
            <Constraint
                android:id="@+id/button"
                android:layout_width="64dp"
                android:layout_height="64dp"
                android:layout_marginStart="8dp"
                motion:layout_constraintBottom_toBottomOf="parent"
                motion:layout_constraintStart_toStartOf="parent"
                motion:layout_constraintTop_toTopOf="parent" />
        </ConstraintSet>

        <ConstraintSet android:id="@+id/end">
            <Constraint
                android:id="@+id/button"
                android:layout_width="64dp"
                android:layout_height="64dp"
                android:layout_marginEnd="8dp"
                motion:layout_constraintBottom_toBottomOf="parent"
                motion:layout_constraintEnd_toEndOf="parent"
                motion:layout_constraintTop_toTopOf="parent" />
        </ConstraintSet>

    </MotionScene>

                                                                                                                                                                       <레퍼런스 기본 예제>

 

<Transition> 모션의 기본정의

       - motion:constraintSetStart  / motion:constraintSetEnd  시작 종료 모션의 포인트 

     위의 포인트들은 나중에 MotionScene에서 참조하여 정의됨.

 

     -motion:duration 은 모션 완료되는데 걸리는 시간. 

-motionInterpolator 은 애니메이션의 보간처리? 

 

<OnSwipe>를 사용하면 터치를 통해 모션을 제어할수있음. 

     - motion:touchAnchorId 는 컨트롤 할 수 있는 뷰를 나타냄.

     -motion:touchAnchorSide ??

     -motion:dragDirection 는 진행률 증가?

    

<ConstraintSet> 은 제약조건을 정의 하고 엔드포인트마다 정의함. (포인트마다 있을필요는 없는듯.?)

 <ConstaintSet> 안에 <Constraint>가 정의됨. 

  ---Constraint 기타 속성들. 

  • alpha
  • visibility
  • elevation
  • rotation, rotationX, rotationY
  • translationZ translationY translationX
  • scaleX, scaleY

<CustomAttribute> 는  <ConstaintSet> 을 변경할때 사용? 

 

4. MotionLayout으로 무엇을 만들수있을까? 

예제 따라한것.

https://github.com/ShinHoChull/MotionLayout

 

음.. 여러개 생각난건 있는데.. 

한번 해본다음에 수정사항 적용해야겠음.

 

5. MotionLayout을 사용해서 느낀점. 

백문불여일견 역시 한번 해보니 이해가 빨랐다.. 

나는 여태까지 코드로 수정했는데.. MotionLayout 으로 이렇게 될줄이야.. 

오래전에 나온거긴한데 .. 세삼 새롭네 ..

이제 코드로 애니메이션 시작 종료를 캐치할수있는지 좀 확인해봐야겠다.. 

가능하다면 여러가지 복합적으로 할 수 있을듯..? 

반응형
반응형

(GPS  주기적인 호출에 관하여..)

음 일단 도즈모드에대해서 이해를 했다면 도움이 됨.

나는 아래 권한을 사용자에게 받아내어서 최적화에서 앱을 제외하면 백그라운드에서 정상적으로 실행이 될 줄 알았다.

ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

 

나는 보통 테스트를 할때  일반적으로 휴대폰을 켜고 사용하고  충전을 하고 음....등등

GPS 테스트 할때도 마찬가지로 휴대폰을 가지고 이동하고 확인하고 잘 되나 보고.. 뭐 문제가 없었다. 

그렇게 지나가는듯 했으나 어쩌다가  위치를 30초 마다 호출을 했는데 찍힌 경로를 보니 이상하게 .. 30초 단위로 찍히지 않음.. 

경로에 공백이 있다.. 

알고보니 도즈모드때문에 그런거였고.. 위 권한 하고는 크게 상관이 없더라.. 

위 권한을 승인받으면 시스템에서 살려주는 주지만 언제 요청하는지는 알 수 없다라고 말하는 듯... 

한참을 좀 해맸는데 .. 잘 해결되서 글을 남긴다. 

나 처럼 백그라운드에서 주기적으로 위치를 요청할라고하면 

뭐 필요한 권한은 알아서 구글님에게 승인을 받으시고 .. 

아래 코드를 사용하면 됨

<Service.kt>

lateinit var mgr : AlarmManager
private fun scheduleAlarms(ctxt: Context) {

    val i = Intent(ctxt, AReceiver::class.java)
    val pi = PendingIntent.getBroadcast(ctxt, 0, i, 0)

    val i2 = Intent(ctxt, AReceiver::class.java)
    val pi2 = PendingIntent.getActivity(ctxt, 0, i2, 0)
    val ac = AlarmClockInfo(
        System.currentTimeMillis() + INTERVAL_TIME,
        pi2
    )
    mgr.setAlarmClock(ac, pi)
}

 

<Receiver.kr>

class AReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {

        Defines.log("hello broadcast~")

        //showNotification(context!!)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val ain = Intent(context, MyService3::class.java)
            ain.putExtra("flag", "re")
            context?.startForegroundService(ain)
        } else {
            val ain = Intent(context, MyService3::class.java)
            ain.putExtra("flag", "re")
            context?.startService(ain)
        }

    }
}

이런식으로 리시버에서 다시 서비스를 호출하면 끈김없이 잘 통신 됨. 

 

반응형

'IT 이야기 > 2021_Android 이것저것' 카테고리의 다른 글

안드로이드 Webview HTTP  (0) 2022.03.18
MotionLayout 맛보기..  (0) 2021.12.29
GPS 위치 정확도 승인  (0) 2021.12.07
RecycleView 높이 가변적으로 조절..  (0) 2021.12.01
Web 에서 App 호출.  (0) 2021.11.29
반응형

 

위치 정확도란.. GPS 해보면 알다싶이.. 위치가 그렇게 정확하지가 않다.. 

사용자에게 위치 정확도 개선 승인을 받으면 그래도 좀더 정확해진다.. 

나는 onResume에서 계속 확인한다.. 

 

필요한사람은 가져다 쓰도록해요~ ..

	//위치 정확도 개선 요청.
    public void requestGpsSettingChange() {
        LocationRequest request = LocationRequest.create();
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        LocationSettingsRequest.Builder builder =
                new LocationSettingsRequest.Builder().addLocationRequest(request);

        Task<LocationSettingsResponse> result = LocationServices
                .getSettingsClient(getApplicationContext())
                .checkLocationSettings(builder.build());

        result.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
            @Override
            public void onSuccess(LocationSettingsResponse locationSettingsResponse) {

            }
        });

        result.addOnFailureListener(this, new OnFailureListener() {

            @Override
            public void onFailure(@NonNull Exception e) {

                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        });
    }

 

https://developer.android.com/training/location/change-location-settings?hl=ko

반응형

+ Recent posts