1. 먼저 뷰를 가져옵니다.

레이아웃과 java파일을 연결해줍니다. PhotoViewAttacher는 나중에 다시 설명하겠습니다.

    private void configViews() {
        mImage = (ImageView) findViewById(R.id.iv_photo_detail);
        mPhotoViewAttacher = new PhotoViewAttacher(mImage);
        mText = (TextView) findViewById(R.id.tv_text_detail);
        mAuthor = (TextView) findViewById(R.id.tv_author_detail);
        mTime = (TextView) findViewById(R.id.tv_time_detail);
    }
cs


2. 시간의 단위를 정합니다.

static final int 로 개별 변수를 지정했고 TIME_MAXIMUM이라는 모델로 묶었습니다.

    private static class TIME_MAX{
        public static final int SEC = 60;
        public static final int MIN = 60;
        public static final int HOUR = 24;
        public static final int DAY = 30;
        public static final int MONTH = 12;
    }
cs


3. 모듈을 import합니다.


import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
cs


4. 시간 계산 함수를 만듭니다.

case문을 사용하는 것보다 if문을 사용하는 것이 가독성이 좋을 것 같습니다.
위에서 지정한 SEC 값보다 변화된 시간이 작으면 just now를 반환합니다. 그렇진 않지만 MIN보다 SEC가 작다면 minutes ago를 반환합니다. 이런식으로 이어지다가 결국 years ago를 반환하게 됩니다. 여기서 문제는 1년도 years ago라고 반환하므로 수정해서 사용하시면 됩니다.

    public static String formatTimeString(Date tempDate) {
        String msg = null;
        if (diffTime < TIME_MAX.SEC) {
            // sec 초
            msg = "just now";
        } else if ((diffTime /= TIME_MAX.SEC) < TIME_MAX.MIN) {
            // min 분
            msg = diffTime + " minutes ago";
        } else if ((diffTime /= TIME_MAX.MIN) < TIME_MAX.HOUR) {
            // hour 시간
            msg = (diffTime) + " hours ago";
        } else if ((diffTime /= TIME_MAX.HOUR) < TIME_MAX.DAY) {
            // day 날
            msg = (diffTime) + " days ago";
        } else if ((diffTime /= TIME_MAX.DAY) < TIME_MAX.MONTH) {
            // month 달
            msg = (diffTime) + " months ago";
        } else {
            msg = (diffTime) + " years ago";
        }
        return msg;
    }
 
cs


5. 시간 계산 함수에 필요한 단위를 만듭니다.

단위는 변수에 저장됩니다. System의 함수로 currentTimeMillis() 를 사용합니다. UTC시간을 이용해서 과거 기준 시간으로부터 지금까지 경과한 시간을 반환합니다. tempDate는 제가 만든 변수인데 여기엔 시간 데이터가 담깁니다. 그래서 getTime을 쓰면 위의 curTime과 연산이 가능하게 됩니다. 그 후 1000으로 나누면 초단위로 값이 계산됩니다.


        long curTime = System.currentTimeMillis();
        long regTime = tempDate.getTime();
        long diffTime = (curTime - regTime) / 1000;
cs


'Java' 카테고리의 다른 글

[android] 비트맵 파일 retrofit 통신 예제  (0) 2018.02.03
[android] Activity 구현 팁  (1) 2018.02.03
[android] Glide와 intent 사용하기  (0) 2018.02.03
[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03

1. 준비물

구글에서 공개한 좋은 모듈이 있습니다. Glide라고 하는 모듈입니다.

Glide : https://github.com/bumptech/glide


import com.bumptech.glide.Glide;
cs


이렇게 하면 Glide를 쓸 수 있게 됩니다.


import com.example.keepair.myapplication.helper.Constants;
import com.example.keepair.myapplication.model.Flower;
cs


이 것은 제가 쓰는 모델입니다. 저는 모델을 Flower라고 작명했습니다.


import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
import uk.co.senab.photoview.PhotoViewAttacher;
 
cs

예외처리와 시간 데이터 처리를 위해 불러옵니다.


    private ImageView mImage;
    private TextView mAuthor, mText, mTime;
    private PhotoViewAttacher mPhotoViewAttacher;
    private Date mDateToUse;
    private String mStriingDate;

cs


데이터를 레이아웃에서 사용할 것이기에 불러와줍니다.


2. 구현 코드


public class DetailActivity extends FragmentActivity {}
cs


이 다음엔 이 안에 들어갈 코드를 구현합니다.


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_detail);
}
cs


Window.FEATURE_NO_TITLE 이 부분을 주의해야 합니다. 윈도우의 디스플레이 사이즈를 정해봅니다.


        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int width = (int) (display.getWidth() * 0.7); //Display 사이즈의 70%
        int height = (int) (display.getHeight() * 0.9);  //Display 사이즈의 90%
        getWindow().getAttributes().width = width;
        getWindow().getAttributes().height = height;
 
cs


int 변수에 display의 값을 지정해줄 수 있습니다.

아래 코드는 날짜 양식을 정하는 코드입니다.


        Intent intent = getIntent();
        Flower flower = (Flower) intent.getSerializableExtra(Constants.REFERENCE.FLOWER);
        configViews();
        mStriingDate = flower.getCreated_date().substring(0, flower.getCreated_date().length()-1);
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ss.SSSSSS");
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        mDateToUse = null;
cs


"yyyy-MM-dd'T'HH:mm:ss.SSSSSS" 여기가 우리가 주로 알던 형식을 이용한 코드입니다. 

 Glide로 마무리하겠습니다.


         try {            mDateToUse = format.parse(mStriingDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
 
        mAuthor.setText(flower.getAuthor());
        mText.setText(flower.getText());
        mTime.setText(formatTimeString(mDateToUse));
        Glide.with(getApplicationContext()).load(flower.getImage()).into(mImage);
cs


Glide로 가져온 이미지를 flower 모델에서 가져온 텍스트와 함께 이미지 레이아웃에 넣어줍니다.

'Java' 카테고리의 다른 글

[android] Activity 구현 팁  (1) 2018.02.03
[android] 경과한 시간에 따른 날짜 표현 방식  (0) 2018.02.03
[android] 구글맵 3  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03
[android] 구글맵 1  (0) 2018.02.03

이번엔 구글맵 자체를 클릭했을 때 좌표를 얻는 방법을 구현해보겠습니다.


1. setOnMapClickListener 사용


        googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 
            }
        });
    }
cs


이렇게 onMapClickListener()를 설정합니다. onMapClickListener의 안에서 여러가지를 구현할 수 있습니다.


            @Override
            public void onMapClick(LatLng point) {
                ReferSharedPreference preferenceCoordinates = new ReferSharedPreference(getContext());
                MarkerOptions marker = new MarkerOptions().position(
                        new LatLng(point.latitude, point.longitude)).title("ok");
                preferenceCoordinates.put("Coor""{ \"longitude\": \""+point.latitude +"\",     \"latitude\": \""+point.longitude+"\" } ");
                preferenceCoordinates.put("Lat"String.valueOf(point.latitude));
                preferenceCoordinates.put("Lon"String.valueOf(point.longitude));

cs


지도의 좌표를 가져올 수 있습니다.


                googleMap.clear();
                googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, 14));
                googleMap.addMarker(marker);
cs


이걸로 애니메이션을 구현합니다. 카메라 줌도 바꿀 수 있으며 마커도 새로 추가할 수 있습니다.


                String lat = preferenceCoordinates.getValue("Lat", "13");
                String lon = preferenceCoordinates.getValue("Lon", "15");
                mCoordinatesTextMap.setText(lat + "  , " + lon);
cs


이렇게 하여 (13,15)를 기본으로 하는 부분을 구현했습니다. 값이 없을 경우에 지정된 값을 불러옵니다.

지난 시간의 코드와 연결됩니다.


2. 참고 코드


                ReferSharedPreference preferenceCoordinates = new ReferSharedPreference(getContext());
                LatLng point = new LatLng(googleMap.getMyLocation().getLatitude(), googleMap.getMyLocation().getLongitude());
                MarkerOptions marker = new MarkerOptions()
                        .position(point).title("ok");
cs


이 부분과의 접점이 있었습니다. 좌표값을 SharedPreference에 저장해 놓거나 새로 저장해서 사용하도록 합니다. 전 ReferSharedPreference라는 새로운 dataType을 만들어서 사용했습니다. 

'Java' 카테고리의 다른 글

[android] 경과한 시간에 따른 날짜 표현 방식  (0) 2018.02.03
[android] Glide와 intent 사용하기  (0) 2018.02.03
[android] 구글맵 2  (0) 2018.02.03
[android] 구글맵 1  (0) 2018.02.03
[android] Fragment 만들기 2-2  (0) 2018.02.03

+ Recent posts