지식메모

 

다빈치 리졸브 16.2.4 기준 따라다니는 글씨와 이미지 만드는 방법입니다.

 

youtu.be/KWSL4amBye0

 

youtu.be/FnhnUKtK88c

 

예능에서 보면 특정인물표정을 잡아주는 확대하는 장면이 나오는데 다빈치리졸브16에서 그 효과를 내보는 방법입니다.

 

 

 

 

 

뜬금 애드센스 게시자 정책 위반되었다는 메일이 와서 확인해보니 가치 있는 인벤토리: 콘텐츠 없음 이라는 사유로 위반이 되었다고 한다.

메일 내용

 

정책센터 모습

 

확인해보니 저 링크는 삭제된 페이지로 나오지 않는 글인데 왜 이것까지 감지해서 위반됐다고 하는지 의문..

 

검토 2가지 방법이 나와있음

 

이미 삭제된 페이지라 뭐 수정할 것도 없기 때문에 옵션 2 방법으로 수행

 

근데 안내사항은 이상한 방법만 알려준다.

새 URL 그룹 만들기 해도 2번에서 막힌다. 대체 뭘 안내한건지 의문. 진짜 불친절하고 성의없는 안내사항

 

광고 > 개요에서 해당 사이트 수정 버튼 클릭

우측 연필모양 클릭

 

그럼 우측에 메뉴가 뜨는데 페이지 제외의 관리를 클릭한다.

 

관리 클릭

 

그럼 페이지 제외 관리 페이지가 뜨는데 미리보기 준비한답시고 화면을 가려버린다. 좀 기다리면 없어지니 기다린 후에

 

미리보기 준비 중이라는 화면이 가리는 중..

 

 

제외 추가를 눌러준 후 문제가 생긴 게시글 URL을 입력해준다. 옵션은 이 페이지만 선택 후 에 추가해주면

 

 

이렇게 제외된 페이지로 추가가 된다.

 

페이지제외가 추가된 모습

 

진짜 구글 애드센스도 보면 메일로 안내사항을 적어주는데 제대로 되어있는게 없다. 하라는 대로 따라하면 메뉴 자체가 존재하지도 않은게 태반이다. 결국 직접 뒤젹거리면서 찾아야 해결이 된다. 좀 더 자세하고 친절하게 알려주면 좋겠다. 메일을 받고도 처리를 못해서 방치되는게 한 두개가 아니다.

 

지금도 ads.txt 어쩌구 메일이 왔는데 안내사항대로 따라하려니 해당 메뉴가 안보인다. 답답할 노릇

 

 

 

 

 

먼저 CPU 가상화 지원 확인

https://gbworld.tistory.com/1604

 

CPU 가상화 AMD SVM, VT 활성화 하는 방법

이번 포스팅에는 녹스, 미뮤, 모모 등의 앱 플레이어의 퍼포먼스를 높이기 위해 필수적인 CPU 가상화 모드 설정 방법에 대해 정리해봤습니다. 참고로 SVM은 AMD CPU의 가상화 옵션, VT는 인텔 CPU의 가상화 옵션을..

gbworld.tistory.com

 

윈도우 설정 

https://m.blog.naver.com/PostView.nhn?blogId=showmeii1201&logNo=221484780893&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

[Android]안드로이드 스튜디오 AVD(에뮬레이터) AMD CPU에서도 빠르게 사용하기

안드로이드 스튜디오를 이용하면서 AVD(에뮬레이터)를 자주 사용합니다. 하지만 AMD CPU에서는 작...

blog.naver.com

 

 

SharedPreferences 사용법은 이분의 블로그를 보고 참고하였음

https://re-build.tistory.com/37

 

[Android] SharedPreferences 사용하기

이래저래 바쁘다는 핑계로 미루다가 오랜만에 포스팅을 하게 되었습니다. 벌써 새해가 밝았네요. 저만 시간이 빨리 가는 것처럼 느껴지는 건 아니겠죠? 모두 새해에는 좋은 일이 생겼으면 좋겠습니다. SharedPrefe..

re-build.tistory.com

앱을 쓰면 자주 보이는 로그인 정보 저장 기능을 구현한다. 

UI 는 다음과 같다

구현 목표는

  • 아이디와 암호를 체크박스 옵션으로 저장 유무를 결정한다.
  • 아이디와 암호를 따로 구분하지 않고 같이 저장함
  • 로그인시 아이디와 암호 둘 중 하나가 입력되지 않으면 "아이디/암호를 입력해주세요" 토스트메시지를 띄운다
  • 아이디/암호 입력 후 로그인 정보 기억하기 체크만 해도 정보가 저장된다.
  • 로그인 정보 기억하기를 체크하면 저장되고 해제하면 정보를 삭제한다

이런 동작을 하도록 구현

위 블로그를 참고하여 PreferenceManager를  만들어주고 MainActivity 이렇게 2개의 파일만 준비되어있으면 된다.

빨간 상자의 클래스는 필수 생성

 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="로그인"
            android:id="@+id/parse"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="QR Scan"
            android:id="@+id/scanQR"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="자산목록"
            android:id="@+id/dbList"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:id="@+id/et_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPersonName"
            android:hint="사번" />

        <EditText
            android:id="@+id/et_pw"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPassword"
            android:hint="암호"/>

        <CheckBox
            android:id="@+id/cb_save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="로그인 정보 기억하기" />

    </LinearLayout>

</RelativeLayout>

 

자세한 설명은 주석 참고

MainActivity.java

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private Button parsingBtn;
    private Button scanQRBtn;
    private Button ListBtn;
    private EditText et_id;
    private EditText et_pw;
    private CheckBox cb_save;
    String id,pw;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this; // 이거 필수!

        parsingBtn = (Button) findViewById(R.id.parse);
        scanQRBtn = (Button) findViewById(R.id.scanQR);
        ListBtn = (Button) findViewById(R.id.dbList);
        et_id = (EditText) findViewById(R.id.et_id);
        et_pw = (EditText) findViewById(R.id.et_pw);
        cb_save = (CheckBox) findViewById(R.id.cb_save);
        
        
        boolean boo = PreferenceManager.getBoolean(mContext,"check"); //로그인 정보 기억하기 체크 유무 확인
        if(boo){ // 체크가 되어있다면 아래 코드를 수행
            //저장된 아이디와 암호를 가져와 셋팅한다.
            et_id.setText(PreferenceManager.getString(mContext, "id")); 
            et_pw.setText(PreferenceManager.getString(mContext, "pw"));
            cb_save.setChecked(true); //체크박스는 여전히 체크 표시 하도록 셋팅
        }

        parsingBtn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){ //로그인 버튼 눌렀을 때 동작
                //아이디 암호 입력창에서 텍스트를 가져와 PreferenceManager에 저장함
                PreferenceManager.setString(mContext, "id", et_id.getText().toString()); //id라는 키값으로 저장
                PreferenceManager.setString(mContext, "pw", et_pw.getText().toString()); //pw라는 키값으로 저장
                
                Intent intent = new Intent(MainActivity.this, Parsing.class); //이건 없어도 무방
                // 저장한 키 값으로 저장된 아이디와 암호를 불러와 String 값에 저장
                String checkId = PreferenceManager.getString(mContext, "id"); 
                String checkPw = PreferenceManager.getString(mContext, "pw");
                //아이디와 암호가 비어있는 경우를 체크
                if (TextUtils.isEmpty(checkId) || TextUtils.isEmpty(checkPw)){
                    //아이디나 암호 둘 중 하나가 비어있으면 토스트메시지를 띄운다
                    Toast.makeText(MainActivity.this, "아이디/암호를 입력해주세요",
                            Toast.LENGTH_SHORT).show();
                }else { //둘 다 충족하면 다음 동작을 구현해놓음
                    intent.putExtra("id",checkId);
                    intent.putExtra("pw",checkPw);
                    startActivity(intent);
                }
            }
        });

        //로그인 기억하기 체크박스 유무에 따른 동작 구현
        cb_save.setOnClickListener(new CheckBox.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (((CheckBox)v).isChecked()) { // 체크박스 체크 되어 있으면
                    //editText에서 아이디와 암호 가져와 PreferenceManager에 저장한다.
                    PreferenceManager.setString(mContext, "id", et_id.getText().toString()); //id 키값으로 저장
                    PreferenceManager.setString(mContext, "pw", et_pw.getText().toString()); //pw 키값으로 저장
                    PreferenceManager.setBoolean(mContext, "check", cb_save.isChecked()); //현재 체크박스 상태 값 저장
                } else { //체크박스가 해제되어있으면
                    PreferenceManager.setBoolean(mContext, "check", cb_save.isChecked()); //현재 체크박스 상태 값 저장
                    PreferenceManager.clear(mContext); //로그인 정보를 모두 날림
                }
            }
        }) ;


        scanQRBtn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Intent intent = new Intent(MainActivity.this, ScanQR.class);
                startActivity(intent);
            }
        });

        ListBtn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
//                Intent intent = new Intent(MainActivity.this, DBHelper.class);
//                startActivity(intent);
            }
        });
    }
}

 

동작 별 코드를 설명하자면

1. 아이디와 암호를 입력 후 로그인 기억하기를 체크했을 때

이 코드가 동작하게 되어 PreferenceManager에 아이디와 암호가 각각 "id","pw"라는 키값으로 저장된다. 사용할 때는 getString에서 이 키값으로 불러와 사용하면 된다.

 

2. 로그인 기억하기가 체크된 상태로 앱을 종료하고 다시 실행했을 때

        boolean boo = PreferenceManager.getBoolean(mContext,"check"); //로그인 정보 기억하기 체크 유무 확인
        if(boo){ // 체크가 되어있다면 아래 코드를 수행
            //저장된 아이디와 암호를 가져와 셋팅한다.
            et_id.setText(PreferenceManager.getString(mContext, "id"));
            et_pw.setText(PreferenceManager.getString(mContext, "pw"));
            cb_save.setChecked(true); //체크박스는 여전히 체크 표시 하도록 셋팅
        }

위 코드에서 로그인 정보 기억하기 체크 유무를 확인한다. 체크가 된 상태로 종료했기 때문에 boo는 true 가 나올 테고 저장되어 있던 "id","pw"키 값을 불러와 아이디,암호 입력창에 셋팅해놓는다.

 

3. 로그인 기억하기 체크를 해제했을 때

위 코드가 동작하여 현재 체크 해제 상태이므로 false를 PreferencerManager에 상태 값을 저장하고 저장된 로그인 정보를 clear 코드로 모두 날린다. 그럼 앱을 종료하고 다시 실행했을 때 입력창에 아무것도 입력되어있지 않는 상태로 나타난다.

 

구현 방법은 사용자마다 다르고 더 깔끔하고 단순하게 작성할 수도 있지만 동작만 된다면 끝. 더 건드렸다가 다시 미궁 속으로 빠지긴 싫다.

 

 

이방법보다 더 편한 방법이 있을지는 모르겠지만 그냥 급한대로 노가다식 노래방 자막 만들기를 해보았다

물론 싱크도 수작업으로 맞춰주어야 한다는 치명적인 단점이 있다.

 

짤막한 가사정도는 급한대로 이 방법으로 노래방 가사를 만들 수 있다.

 

https://youtu.be/94RZvHmWy64

 

 

 

 

갤럭시S10 삼성 갤러리에서 인물 배경을 간편하게 지워주는 방법. 갤럭시S10만 되는게 아니라 삼성 폰을 쓰면 아마 대부분 되는 방법이다. 단 Android 버전이 너무 낮으면 지원을 안하는 기능임. Android 9나 10버전이면 지원 가능함 그 이하는 지원여부 미확인

 

 

https://youtu.be/aIL74G_v1lE

 

 

 

영상에 타이머를 표시하는 방법

다빈치리졸브 16.1.2 기준

 

https://youtu.be/EMFHEWMdTbg

 

Text+ 를 사용한다. Fusion기반이기에 로딩이 좀 느리지만 렌더링 후 정상적으로 동작함

 

숫자 표시 방식도 변경 가능하다

Expression을 선택하여 변경 가능
time은 일반적인 숫자 증가

하지만 너무 빠르게 증가하는데 프레임 수로 나눠주어야 정상적으로 증가한다

소수점이 나오는 경우 floor를 붙여준다

 

100-floor(time/프레임수)

100- 는 100부터 감소함

 

floor(time/프레임수)+100

 

 

time*숫자

숫자만큼 증가함 예를 들면 time*20 은 20씩 증가함

 

 

random(0,20) 

0부터 20 사이의 무작위 숫자를 표시함. 범위는 변경 가능

+ Recent posts