지도를 사용하다가 현재 이미지를 불러와서 파일로 저장을 한다던지,

공유 기능에 붙일 것인지 유용하게 사용할수 있습니다.


java 코드

final ImageView iv_capture = (ImageView) view.findViewById(R.id.iv_capture);
Button button_capture = (Button) view.findViewById(R.id.button_capture);
button_capture.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View view) {
		GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() {
			@Override
			public void onSnapshotReady(Bitmap snapshot) {
				iv_capture.setImageBitmap(snapshot);
			}
		};
		mGoogleMap.snapshot(callback);
	}
});


적용 화면




actionbar 아래 shodow 없애기

AppBarLayout 내에 app:evlevation="0dp" 를 추가하면 됩니다.


xml 코드 수정 

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:elevation="0dp" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" >

변경전



변경후


Actionbar home, arrow, title color 변경하는 방법입니다.

style 테마로 지정하는 방법도 있겠지만, 지금 경우는 버튼을 눌렀을 경우 유동적으로 변할 수 

있도록 java 코드로 작성하였습니다.


color 값을 준비합니다.

    <color name="color_memo1">#03a9f3</color>
    <color name="color_memo2">#8bc349</color>
    <color name="color_memo3">#ffc108</color>
    <color name="color_memo4">#ff5720</color>
    <color name="color_memo5">#9e9e9e</color>

    <color name="color_text1">#0000ff</color>
    <color name="color_text2">#259b20</color>
    <color name="color_text3">#ff9700</color>
    <color name="color_text4">#ff0000</color>
    <color name="color_text5">#ffffff</color>


코드 내용

private void setColorBt(int index) {

	ib_color_1.setBackgroundResource(R.color.color_memo1);
	ib_color_2.setBackgroundResource(R.color.color_memo2);
	ib_color_3.setBackgroundResource(R.color.color_memo3);
	ib_color_4.setBackgroundResource(R.color.color_memo4);
	ib_color_5.setBackgroundResource(R.color.color_memo5);

	int colorBgId = R.color.color_memo1;
	int colorTxtId = R.color.color_text1;
	if(index == 0) {
		ib_color_1.setBackgroundResource(R.drawable.bt_color_frame);
	} else if(index == 1) {
		colorBgId = R.color.color_memo2;
		colorTxtId = R.color.color_text2;
		ib_color_2.setBackgroundResource(R.drawable.bt_color_frame);
	} else if(index == 2) {
		colorBgId = R.color.color_memo3;
		colorTxtId = R.color.color_text3;
		ib_color_3.setBackgroundResource(R.drawable.bt_color_frame);
	} else if(index == 3) {
		colorBgId = R.color.color_memo4;
		colorTxtId = R.color.color_text4;
		ib_color_4.setBackgroundResource(R.drawable.bt_color_frame);
	} else if(index == 4) {
		colorBgId = R.color.color_memo5;
		colorTxtId = R.color.color_text5;
		ib_color_5.setBackgroundResource(R.drawable.bt_color_frame);
	}
	lay_frame.setBackgroundResource(colorBgId);

	setActionBarColor(colorBgId, colorTxtId);
}

public void setActionBarColor(int colorBgId, int colorId) {

	int colorBg = ContextCompat.getColor(getBaseContext(), colorBgId);
	int colorText = ContextCompat.getColor(getBaseContext(), colorId);

	ActionBar bar = getSupportActionBar();
	if(bar != null) {
		// bar 백그라운드 색상 변경
		bar.setBackgroundDrawable(new ColorDrawable(colorBg));

		// 타이틀 색상 변경
		Spannable text = new SpannableString(bar.getTitle());
		text.setSpan(new ForegroundColorSpan(colorText), 0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
		bar.setTitle(text);

		// 홈,화살표 버튼 색상 변경
		mToggle.getDrawerArrowDrawable().setColor(colorText);
	}
}


결과 화면

    


날씨 : 따뜻함, 바람 조금

미세먼지 : 적음

체중 : 72.1kg


후기 : 긴팔입고 달리기 함, 조금있으면 반팔 입어도 될듯

달리고 나서 바로 밥을 먹고 왔더니 체중이 많이 나옴



     

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

[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월 11일  (0) 2017.04.11

데이터를 한꺼번에 집어 넣기 위해 편리한 방법을 검색,

jexcelapi:jxl 라이브러리를 이용하여 테스트 코드를 만들어 보았습니다.


주의사항! 

엑셀 파일은 Excel 97 ~ 2003 통합 문서 (.xls) 만 지원가능합니다.


엑셀파일 준비하여 앱 내의 > src > main > assets 폴더에 엑셀파일 추가 (없으면 디렉토리 생성 하시면 됩니다.) 

1. 프로젝트에서 > Open Module Settings 를 선택합니다.



2. app > Dependencies > 하단 (+) 버튼 클릭 > jxl 로 검색 후 적용


3. 코드 적용

public class MainActivity extends AppCompatActivity {

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

        try {
            InputStream is = getBaseContext().getResources().getAssets().open("my_excel.xls");
            Workbook wb = Workbook.getWorkbook(is);

            if(wb != null) {
                Sheet sheet = wb.getSheet(0);   // 시트 불러오기
                if(sheet != null) {
                    int colTotal = sheet.getColumns();    // 전체 컬럼
                    int rowIndexStart = 1;                  // row 인덱스 시작
                    int rowTotal = sheet.getColumn(colTotal-1).length;

                    StringBuilder sb;
                    for(int row=rowIndexStart;row<rowTotal;row++) {
                        sb = new StringBuilder();
                        for(int col=0;col<colTotal;col++) {
                            String contents = sheet.getCell(col, row).getContents();
                            sb.append("col"+col+" : "+contents+" , ");
                        }
                        Log.i("test", sb.toString());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BiffException e) {
            e.printStackTrace();
        }
    }
}



4. 완료 화면 로그



Bitmap 이미지 모서리 round 처리하기


코드 사용

Button button2 = (Button) findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Bitmap bm = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); imageView.setImageBitmap(getRoundedCornerBitmap(bm, 20)); } });

호출

/* 비트맵 모서리 둥글게*/
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int px) {
	Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
	Canvas canvas = new Canvas(output);
	final int color = 0xff424242;
	final Paint paint = new Paint();
	final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
	final RectF rectF = new RectF(rect);
	final float roundPx = px;
	paint.setAntiAlias(true);
	canvas.drawARGB(0, 0, 0, 0);
	paint.setColor(color);
	canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
	paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
	canvas.drawBitmap(bitmap, rect, rect, paint);
	return output;
}


변경 전


변경 후


사진을 찍던, 갤러리에 보관이 되던 썸네일은 항상 internal 에 보관이 되어있습니다.

리스트에서 사용을 앱의 성능 향상을 위해서는 썸네일을 쓰는 것이 좋습니다.


코드 사용

xml 코드

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="갤러리 호출"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="16dp" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

java 코드

public class MainActivity extends AppCompatActivity {

    private static final int PICK_FROM_ALBUM = 1;
    ImageView imageView;

    //권한 추가
    private static final int REQUEST_PERMISSIONS = 1;
    private static final String[] MY_PERMISSIONS = {
            Manifest.permission.READ_EXTERNAL_STORAGE
    };
    public 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;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_PERMISSIONS) {
            int index = 0;
            for (String permission : permissions) {
                if(permission.equalsIgnoreCase(Manifest.permission.READ_EXTERNAL_STORAGE) && grantResults[index] == PackageManager.PERMISSION_GRANTED) {
                    getGalley();
                    break;
                }
                index++;
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

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

        imageView = (ImageView) findViewById(R.id.imageView);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    boolean permission = hasAllPermissionsGranted();
                    Log.e("test","permission : "+permission);
                    if(!permission)
                    	return;
                }
		getGalley();
            }
        });
    }

    private void getGalley() {
        Intent intent = new Intent(Intent.ACTION_PICK,  android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
        startActivityForResult(intent, PICK_FROM_ALBUM);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_FROM_ALBUM) {
            if (resultCode == Activity.RESULT_OK) {
                Log.d("test","data : "+data);
                if(data != null) {
                    Uri returnImg = data.getData();
                    if("com.google.android.apps.photos.contentprovider".equals(returnImg.getAuthority())) {
                        for(int i=0;i<returnImg.getPathSegments().size();i++) {
                            String temp = returnImg.getPathSegments().get(i);
                            if(temp.startsWith("content://")) {
                                returnImg = Uri.parse(temp);
                                break;
                            }
                        }
                    }
                    // 썸네일 가져오기
                    Bitmap bm = getThumbNail(returnImg);
                    imageView.setImageBitmap(bm);
                }
            }
        }
    }

    private Bitmap getThumbNail(Uri uri) {
        Log.d("test","from uri : "+uri);
        String[] filePathColumn = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE/*, MediaStore.Images.Media.ORIENTATION*/};

        ContentResolver cor = getContentResolver();
        //content 프로토콜로 리턴되기 때문에 실제 파일의 위치로 변환한다.
        Cursor cursor = cor.query(uri, filePathColumn, null, null, null);

        Bitmap thumbnail = null;
        if(cursor != null) {
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            long ImageId = cursor.getLong(columnIndex);
            if(ImageId != 0) {
                BitmapFactory.Options bmOptions = new BitmapFactory.Options();
                thumbnail = MediaStore.Images.Thumbnails.getThumbnail(
                        getContentResolver(), ImageId,
                        MediaStore.Images.Thumbnails.MINI_KIND,
                        bmOptions);
            } else {
                Toast.makeText(this, "불러올수 없는 이미지 입니다.", Toast.LENGTH_LONG).show();
            }
            cursor.close();
        }
        return thumbnail;
    }
}

작업 전


썸네일 불러오기 후

작업을 하다보면 간혹 OS의 오류인지 기기의 문제인지

아래와 같은 현상이 아주 가끔 발생합니다.



수정 코드

android.support.v7.widget.Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

toolbar.setContentInsetsAbsolute(0, 0);

setSupportActionBar(toolbar);


결과 화면



여러가지 연동 작업을 하다보면 해쉬키를 얻어와야할 경우가 생깁니다.

Google map 이라던지, facebook 연동이라던지 기타등등


사용 코드

try {     // 해시키
    PackageInfo info = getPackageManager().getPackageInfo("your package", PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        String sign= Base64.encodeToString(md.digest(), Base64.DEFAULT);
        Log.e("test", "hash key : " + sign);
        //Toast.makeText(getApplicationContext(),sign,     Toast.LENGTH_LONG).show();
    }
} catch (PackageManager.NameNotFoundException e) {
    Log.e("test", "hash key1 : "+e.toString());
} catch (NoSuchAlgorithmException e) {
    Log.e("test", "hash key2 : "+e.toString());
}


ImageView 안에 있는 resource 컬러값 변경

이미지 리소스가 단색일 경우에만 유용하게 사용 할 수 있습니다.

코드 한두줄로 처리가 되니깐, 이미지를 다시 재작업 하는 번거로움을 없앨수 있겠습니다.


작업 전



코드 사용

ImageView iv_icon_map = (ImageView) view.findViewById(R.id.iv_icon_map);

int color = ContextCompat.getColor(getActivity(), R.color.color_red);

iv_icon_map.setColorFilter(color);



작업 후


+ Recent posts