개발짓을 하다보니 빠르고 쉽게 컬러값을 get 해야하는 경우가 생깁니다.

Mac에는 기본 프로그램으로 좋은게 있습니다.

디지털 컬러 측정기





하지만 고유값이 10진수로 보이는데, 내가 필요한 개발에는 16진수가 필요하므로 바꿔줍니다.




'Mac' 카테고리의 다른 글

mac terminal 파일, 폴더 색상 변경  (0) 2017.04.12
mac root 계정 설정하기  (0) 2017.04.12
mac terminal 테마 변경 하기  (0) 2017.04.11

mac terminal 파일, 폴더 색상을 변경하는 법

ls를 해보면 아래와 같이 한가지 색상으로 통일 되어 있어서 작업을 위해서 구분이 필요할때가 있습니다.



.bash_profile을 열어서 수정합니다.

없으면 ( touch .bash_profile )


코드 추가

export CLICOLOR=1
export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "
export LSCOLORS=ExFxBxDxCxegedabagacad
alias ls='ls -GFh'


export LSCOLORS= Fx Fx Bx Dx Cx eg ed ab ag ac ad

  1   2   3   4   5   6    7   8   9 10 11

a black 
b red 
c green 
d brown 
e blue 
f magenta 
g cyan 
h light grey 
A bold black, usually shows up as dark grey 
B bold red 
C bold green 
D bold brown, usually shows up as yellow 
E bold blue 
F bold magenta 
G bold cyan 
H bold light grey; looks like bright white 
x default foreground or background 

1. directory 
2. symbolic link 
3. socket 
4. pipe 
5. executable 
6. block special 
7. character special 
8. executable with setuid bit set 
9. executable with setgid bit set 
10. directory writable to others, with sticky bit 
11. directory writable to others, without sticky 


vi 화면



그럼 아래와 같이 적용된 모습을 확인 할수 있습니다.



'Mac' 카테고리의 다른 글

mac 컬러 픽커 사용하기 (마우스 포인트의 컬러값)  (0) 2017.04.12
mac root 계정 설정하기  (0) 2017.04.12
mac terminal 테마 변경 하기  (0) 2017.04.11

터미널을 실행하여 

sudo -s 입력하여 패스워드를 입력합니다. 패스워드는 mac 계정 비번




아래와 같이 나오면 성공




이제 root 의 비번을 설정합니다.

bash-3.2#에서 passwd root 입력




설정이 되었으면 exit 를 눌러 #모드에서 빠져 나옵니다.


제대로 설정이 되었나 확인해 봅시다.

su 입력 후

whoami 입력 하면 아래와 같이 root라고 나오면 완료!



메뉴 > 터미널 > 환경설정을 선택합니다.



프로파일 탭에서 왼쪽, 아래 + 표시를 눌러 추가합니다.

배경을 눌러 컬러값을 선택합니다.




텍스트, 볼드 텍스트 기타 등등 컬러를 원하는 값으로 변경합니다.



일반 탭으로 와서 시작시 열기: 새로운 윈도우에서 나의 테마를 선택하여 줍니다.


날씨 : 바람 조금, 더움

미세먼지 : 적음

체중 : 70.6kg


후기 : 뛰기전 쉬원함, 더움, 바람막이는 이제 안입어도 될듯 긴팔만 입고,

갈증이 빨리 충분한 수분섭취가 필요할



     

'달리기 흔적' 카테고리의 다른 글

[5km] 2017년 4월 25일 화요일  (0) 2017.04.25
[5km] 2017년 4월 21일  (0) 2017.04.21
[5km] 2017년 4월 18일  (0) 2017.04.18
[10km] 2017년 4월 16일  (0) 2017.04.16
[5km] 2017년 4월 13일  (0) 2017.04.13

MapView inside ScrollView (fragment)


프래그멘트 안에 있는 ScrollView 에  맵뷰 달기


fragment_maps.xml 맵뷰의 레이아웃을 정의 합니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>


MapInFragment.java뷰의 클레스를 정의합니다.

public class MapInFragment extends Fragment {

    MapView mMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_maps, container, false);
        mMap = (MapView) v.findViewById(R.id.mapView);
        mMap.onCreate(savedInstanceState);
        mMap.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    boolean permission = hasAllPermissionsGranted();
                    if (permission) {
                        Log.e("test","aaaa");
                    }
                    return;
                }
                googleMap.getUiSettings().setMyLocationButtonEnabled(true);
                googleMap.getUiSettings().setZoomControlsEnabled(true);
                googleMap.setMyLocationEnabled(true);

                try {
                    MapsInitializer.initialize(getActivity());
                } catch (Exception e) {

                }

                googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(37.488, 126.891), 15));
            }
        });

        return v;
    }

    @Override
    public void onResume() {
        mMap.onResume();
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mMap.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mMap.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mMap.onLowMemory();
    }

    //권한 추가
    private static final int REQUEST_PERMISSIONS = 1;
    private static final String[] MY_PERMISSIONS = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };
    private boolean hasAllPermissionsGranted() {
        for (String permission : MY_PERMISSIONS) {
            if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), MY_PERMISSIONS, REQUEST_PERMISSIONS);
                return false;
            }
        }
        return true;
    }
}


코드 적용 (7.0 버전으로 만들어서 시스템 permission 권한 코드 포함)

Activity layout 에서 ScrollView 안에 정의합니다.

<ScrollView

...

<FrameLayout android:id="@+id/map_container"
	android:layout_width="match_parent"
	android:layout_height="200dp"
	android:layout_marginTop="10dp"/>
...

</ScrollView>

Fragment 내에서의 처리

public class AddMemoFragment extends Fragment {

    FrameLayout map_container;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_add, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        map_container = (FrameLayout) view.findViewById(R.id.map_container) ;

        MapInFragment map = new MapInFragment();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.replace(R.id.map_container, map).commit();
    }
}


결과 화면


   

MapView inside ScrollView (activity)



참고Url

http://www.londatiga.net/it/programming/android/how-to-make-android-map-scrollable-inside-a-scrollview-layout/



리스트뷰안에 맵을 넣는 것을 검색하다가 적용 및 테스트를 해봤습니다.

위의 주소에 있는 코드에서는 ScrollView와 MapView 의 터치 이벤트를 동시에 적용되는 기능도 처리가 되어 있어서

여러모로 쓸모가 많은 코드네요.


fragment_maps.xml 맵뷰의 레이아웃을 정의 합니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>


WorkaroundMapFragment.java의 클레스를 정의합니다.

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.google.android.gms.maps.SupportMapFragment;

public class WorkaroundMapFragment extends SupportMapFragment {
    private OnTouchListener mListener;

    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstance) {
        View layout = super.onCreateView(layoutInflater, viewGroup, savedInstance);
        TouchableWrapper frameLayout = new TouchableWrapper(getActivity());
        frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));
        ((ViewGroup) layout).addView(frameLayout,
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        return layout;
    }

    public void setListener(OnTouchListener listener) {
        mListener = listener;
    }

    public interface OnTouchListener {
        public abstract void onTouch();
    }

    public class TouchableWrapper extends FrameLayout {
        public TouchableWrapper(Context context) {
            super(context);
        }
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            if(mListener == null)
                return false;
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mListener.onTouch();
                    break;
                case MotionEvent.ACTION_UP:
                    mListener.onTouch();
                    break;
            }
            return super.dispatchTouchEvent(event);
        }
    }
}


코드 적용

Activity layout 에서 ScrollView 안에 정의합니다.

<ScrollView ... <fragment android:tag="fragment_map"     android:id="@+id/fragment_map"     android:layout_width="match_parent"     android:layout_height="300dp"     android:layout_marginTop="20dp"     class="your package .WorkaroundMapFragment"/> ... </ScrollView>

Activity 내에서의 처리

public class MainActivity extends AppCompatActivity {

    private GoogleMap mMap;
    private ScrollView mScrollView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_back);

        WorkaroundMapFragment mapFrag = (WorkaroundMapFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_map);
        mapFrag.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                if (ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    boolean permission = hasAllPermissionsGranted();
                    if (permission) {
                        Log.e("test","permission "+permission);
                    }
                    return;
                }
                googleMap.setMyLocationEnabled(true);
                googleMap.getUiSettings().setZoomControlsEnabled(true);
            }
        });

        mScrollView = (ScrollView) findViewById(R.id.sv_container);
        mapFrag.setListener(new WorkaroundMapFragment.OnTouchListener() {
            @Override
            public void onTouch() {
                mScrollView.requestDisallowInterceptTouchEvent(true);
            }
        });
    }

    //권한 추가
    private static final int REQUEST_PERMISSIONS = 1;
    private static final String[] MY_PERMISSIONS = {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION
    };
    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    private boolean hasAllPermissionsGranted() {
        for (String permission : MY_PERMISSIONS) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, MY_PERMISSIONS, REQUEST_PERMISSIONS);
                return false;
            }
        }
        return true;
    }
}



결과 화면




참고 Url

https://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager()


fragment 안에 fragment 집어 넣기

작업을 하다보면 프레그멘트 안에 프레그멘트를 집어 넣어야 할경우가 생깁니다.

예를 들어 MapFragment 라던지..


주의사항! 

getChildFragmentManager() 는 api 17 부터 사용이 가능하다고 되어있어서,

최소버전의 조정이라든지, 아니면 옛날 support-v4 라이브러리를 수동으로 import 해서 사용할수도 있지만

Dex문제라던지(Multi dex 필요) 여러모로 번거로움이 생기드라구요




방법1. XML 내에서의 정의

<fragment
    android:id="@+id/frame"
    android:name="your package name.SubFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="20dp"
    android:tag="info_sub"/>

방법2. Java code 로 정의

Override method 추가 해준뒤에


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Fragment sub2 = new SubFragment2();
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.replace(R.id.frame_container2, sub2).commit();
}

}

처음 새 프로젝트를 만들게 되면 아래에 같은 모양이 됩니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ... 중략 ...
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
        this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

ActionBarDrawerToggle 에서는 이미 DrawerLayout.DrawerListener 를 가지고 있으므로 아래와 같이 추가를 해주시면 되겠습니다.

(Android Studio) 메뉴 > Code > Ovrride Methods .... 선택후

onDrawerSlide

onDrawerOpened

onDrawerClosed

onDrawerStateChanged 원하는 것을 추가하면 됩니다.


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ... 중략 ...
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
        this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
        this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

    @Override
    public void onDrawerSlide(View drawerView, float slideOffset) {
        super.onDrawerSlide(drawerView, slideOffset);
    }

    @Override
    public void onDrawerOpened(View drawerView) {
        super.onDrawerOpened(drawerView);
    }

    @Override
    public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);
    }

    @Override
    public void onDrawerStateChanged(int newState) {
        super.onDrawerStateChanged(newState);
    }
};

    //drawer.setDrawerListener(toggle); // 이건 Deprecated 되었다니깐 아래와 같이 바꿔줍니다.
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

추가적으로
Fragment 교체 등 에서 Actionbar 의 홈 버튼을 화살표 이미지로 바꿨을 경우에 

손가락으로 밀었을때 좌측메뉴(DrawerLayout) 가 나오면 안되니깐


막기

drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);


풀기

drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);


minifyEnabled (코드 축소)

shrinkResource(리소스 축소)


장점

- 안쓰는 코드를 줄여서 축소 빌드를 할 수 있게 도와준다.

- 용량이 줄어듬

- 난독처리


단점 (true 선택시)

- 유지할 코드 충분히 확인시 proguard에 적용 시켜줘야 하는 번거로움

- 빌드속도가 느려지기 때문에 Debug 모두에선 false가 좋음


참조 url

https://developer.android.com/studio/build/shrink-code.html?hl=ko



테스트 - 원본사이즈




테스트 - 코드 축소 (반 이상이 줄어들음...)




테스트 - 리소스 축소 (리소스에서 변환이 없어서 확인해본 결과 대부분 사용중인 것으로...)


+ Recent posts