[Android] TextView, 글자에 외곽선(Border, outline) 넣기

Posted by Find my true self Fimtrus
2014.06.24 16:41 Programming/Android

안드로이드에서 외곽선을 넣기 위해선 TextView를 Customizing해야한다.(다른방법이 있을 수도..;)


TextView를 상속받아서 뷰를 조금 수정해야하고,


편하게 사용하기 위해 attr을 선언해주면 된다.


먼저 TextView를 상속 받은 OutlineTextView를 만든다.


public class OutlineTextView extends TextView {

	private boolean hasStroke = false;
	private float mStrokeWidth = 0.0f;
	private int mStrokeColor;

	public OutlineTextView(Context context) {
		super(context);
	}

	public OutlineTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView(context, attrs);
	}

	public OutlineTextView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView(context, attrs);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		if (hasStroke) {
			ColorStateList states = getTextColors();
			getPaint().setStyle(Style.STROKE);
			getPaint().setStrokeWidth(mStrokeWidth);
			setTextColor(mStrokeColor);
			super.onDraw(canvas);

			getPaint().setStyle(Style.FILL);
			setTextColor(states);
		}
		super.onDraw(canvas);
	}

	private void initView(Context context, AttributeSet attrs) {
		TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.OutlineTextView);
		hasStroke = typeArray.getBoolean(R.styleable.OutlineTextView_textStroke, false);
		mStrokeWidth = typeArray.getFloat(R.styleable.OutlineTextView_textStrokeWidth, 0.0f);
		mStrokeColor = typeArray.getColor(R.styleable.OutlineTextView_textStrokeColor, 0xffffffff);
	}
}


그리고 attr을 선언해준다. xml 파싱과정에서 관련된 value들을 받기 위해선 필수!

(\values\attrs.xml 에 선언해주면 된다.)


아래와 같이 선언해 놓으면 OutlineTextView를 사용할 때 해당 attribute를 사용할 수 있게 된다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="OutlineTextView">
        <attr name="textStroke" format="boolean"/>
        <attr name="textStrokeWidth" format="dimension"/>
        <attr name="textStrokeColor" format="color"/>
    </declare-styleable>
</resources>


마지막으로 layout에 추가해주면 된다.

* xmlns의 이름 부분에는 xml에서 사용할 이름을 지정하면 된다.

* 패키지명은 반드시 앱 패키지 명과 동일해야 한다.

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
	xmlns:@@이름@@="http://schemas.android.com/apk/res/@@ 패키지명 @@" 
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent" 
	android:orientation="vertical">
	<com.fimtrus.flicktalk.view.OutlineTextView
		android:id="@+id/outlineTextView1" 
		android:layout_width="match_parent" 
		android:layout_height="wrap_content" 
		android:gravity="center_horizontal" 
		android:layout_above="@+id/relativeLayout1" 
		android:layout_centerhorizontal="true" 
		android:textsize="50sp" 
		android:layout_marginbottom="20dp" 
		android:text=" " 
		android:textcolor="@color/white" 
		android:padding="5dp" 
		android:singleline="false" 
		@@이름@@:textstroke="true" 
		@@이름@@:textstrokecolor="#000000" 
		@@이름@@:textstrokewidth="7.0">
	</com.fimtrus.flicktalk.view.OutlineTextView>
</linearlayout>


이 댓글을 비밀 댓글로
    • 2015.12.11 14:10
    비밀댓글입니다
  1. 조금더 보태자면 <attr name="textStrokeWidth" format="float">
    textStrokeWidth를 dimension으로 변경하고,
    mStrokeWidth = typeArray.getFloat(R.styleable.OutlineTextView_textStrokeWidth, 0.0f);
    getFloat -> getDimension으로 하시면 dp 값으로 적용 가능합니다.

[Android] 안드로이드에서 httpPost multiparts로 전송하기(멀티파트, 멀티파츠)

Posted by Find my true self Fimtrus
2014.06.24 16:10 Programming/Android

안드로이드에서는 httpClient의 버전이 낮아 multiparts를 지원하지 않는다.


보내고 싶다면 httpConnection을 열고, buffer를 통해서 전송해야 하는데,


만들기가 여간 귀찮은 것이 아니다.


apache에서 httpComponents를 제공하고 있는데, 해당 라이브러리를 사용하면,


별다른 구현을 하지 않더라도 multiparts로 전송할 수 있게 된다.


물론 약 1메가 정도의...라이브러리가 추가되긴 하지만..



아파치 사이트로 이동하여 httpClient 최신버전을 다운받는다.(전 4.3.X 버전 사용중)


Download Page(Click)


당연히 jar 파일이 필요하기 때문에 binary를 클릭해서 받아준다.




다운후 압축을 해제하게 되면, examples, lib, tutorial 폴더가 나오는데,


lib에 있는 jar파일들을 안드로이드 프로젝트의 libs 폴더로 복사하면 된다.


이제 multiparts로 전송하기 위한 준비는 다 되었고, 아래의 코드를 이용하여 보내면 된다.


//Multipart 객체를 선언한다.
MultipartEntityBuilder builder = MultipartEntityBuilder.create() //객체 생성...
	.setCharset(Charset.forName("UTF-8")) //인코딩을 UTF-8로.. 다들 UTF-8쓰시죠?
	.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
builder.addPart("content",  new FileBody(== 파일객체 ==) ); //빌더에 FileBody 객체에 인자로 File 객체를 넣어준다.
builder.addPart("testKey",  "testData" ); //스트링 데이터..

HttpClient client = AndroidHttpClient.newInstance("Android");

HttpPost post = new HttpPost(== url ==); //전송할 URL 
try {
	post.setEntity(builder.build()); //builder.build() 메쏘드를 사용하여 httpEntity 객체를 얻는다.
	HttpResponse httpRes;
	httpRes = client.execute(post);
	HttpEntity httpEntity = httpRes.getEntity();
	if (httpEntity != null) {
		response = EntityUtils.toString(httpEntity);
	}
} catch (UnsupportedEncodingException e) {
} catch (ClientProtocolException e1) {
} catch (IOException e1) {
} catch (ParseException e) {
}


위와 같이 전송하게 되면, 내부적으로 Stream을 이용하여 서버로 전송하게 되어


따로 작업을 하지 않더라도 multiparts 형태로 전송할 수 있다.


이 댓글을 비밀 댓글로
    • huhu
    • 2015.12.19 22:16
    예제 소스 파일좀 부탁드리겠습니다. 아무리해도 적용이 안됩니다.;

[Android, Hybrid] JavascriptInterface 사용법.

Posted by Find my true self Fimtrus
2014.06.24 14:21 Programming/Hybrid App

아이폰의 경우 Native와 Web간의 통신을 위해서 scheme를 이용하지만 


안드로이드에서는 JavascriptInterface를 이용하여 더욱 편하게 데이터를 주고 받을 수 있다.

예제로 간단한 Toast를 보여주는 인터페이스를 만들어 보겠다.


먼저 웹뷰에 추가 시킬 JavascriptInterface 클래스를 만든다.


public class WebViewInterface {

	private WebView mAppView;
	private Activity mContext;

	/**
	 * 생성자.
	 * @param activity : context
	 * @param view : 적용될 웹뷰
	 */
	public WebViewInterface(Activity activity, WebView view) {
		mAppView = view;
		mContext = activity;
	}
	/**
	 * 안드로이드 토스트를 출력한다. Time Long.
	 * @param message : 메시지
	 */
	@JavascriptInterface
	public void toastLong (String message) {
		Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
	}
	/**
	 * 안드로이드 토스트를 출력한다. Time Short.
	 * @param message : 메시지
	 */
	@JavascriptInterface
	public void toastShort (String message) { // Show toast for a short time
		Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
	}
}

안드로이드 4.3.X 젤리빈 이상부터 "@JavascriptInterface" annotation을 붙이지 않을 경우

해당 메쏘드는 동작하지 않기 때문에 반드시 붙여줘야한다.(킷캣이상인가??;;)



그리고 Activity의 onCreate 혹은 Fragment의 onCreateView 에서 loadUrl이 불리기전에

WebView 객체의 addJavascriptInterface 메쏘드를 이용해 연결시켜 주면 바로 사용할 수 있다.

무지 간단하다!

public class MainActivity {

	private WebView mWebView = null;
	private WebViewInterface mWebViewInterface;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getWindow().requestFeature(Window.FEATURE_PROGRESS);
		setContentView(R.layout.activity_main);
		mWebView = (WebView) findViewById(R.id.webview); //웹뷰 객체
		mWebViewInterface = new WebViewInterface(MainActivity.this, mWebView); //JavascriptInterface 객체화
		mWebView.addJavascriptInterface(mWebViewInterface, "Android"); //웹뷰에 JavascriptInterface를 연결
	}
}

addJavascriptInterface를 보면 인터페이스 객체와, 웹에서 사용될 객체 명을 넣어준다.

위와 같이 연결을 하게 되면, 웹페이지에 window.Android 객체가 생성되고, WebViewInterface에 정의된

모든 메쏘드를 사용할 수 있게 된다.


웹페이지에 아래와 같이 입력하게 되면, 안드로이드 Toast를 통해 "JavascriptInterface Test"라는 문구가 보이게 된다.

window.Android.toastShort( "JavscriptInterface Test" );


이 댓글을 비밀 댓글로

My UserAgent 유저에이전트 알아내기

Posted by Find my true self Fimtrus
2014.05.08 14:18 Programming

한줄 끝!

window.navigator.userAgent



UserAgent is :


이 댓글을 비밀 댓글로

[HTML5] audio, video tag 지원 유무 확인

Posted by Find my true self Fimtrus
2014.04.28 18:17 Programming/Hybrid App

if ( document.createElement("video").canPlayType ) {console.log("true")} //지원
else { console.log( "false" );} //미지원
이 댓글을 비밀 댓글로

[Javascript] 정규식. 전화번호, 휴대폰 번호 추출. 검증

Posted by Find my true self Fimtrus
2013.12.20 10:20 Programming/Hybrid App

웹페이지를 제작시, 전화번호를 입력받는 화면이 있다.

아래와 같은 화면...

운전자 연락처(숫자만 입력) (필수입력)


파라미터, 화면 디스플레이시 하이픈(-)을 요구할 때,

정규식을 사용하면 편하다.


//가운데가 4자리
"01012345678".replace(/^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?([0-9]{3,4})-?([0-9]{4})$/, "$1-$2-$3")
//가운데가 3자리
"0101234567".replace(/^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?([0-9]{3,4})-?([0-9]{4})$/, "$1-$2-$3")

이렇게 정규식을 사용하면 가운데가 3자리든 4자리든 010-1234-5678, 010-123-4567 의 형태로 변경하여 사용할 수 있다.

* $1, $2, $3 : 괄호 순서대로 값들을 들고 올 수 있다.

* 시작부분 ^ : [] 안의 ^ 는 부정을 의미하지만, [] 밖의 ^는 시작을 의미한다.

* 끝 부붙 $ : 끝을 의미한다. 위의 정규식으로 보자면 끝에 4자리 라고 표현된다.

이 댓글을 비밀 댓글로

[Javascript] // 주석제거 정규식.

Posted by Find my true self Fimtrus
2013.06.19 17:58 Programming/Hybrid App

언어마다 정규식 표현방식이 다르다.

특히 Javascript의 경우, RegExp라는 function을 사용하여 만든다. ( 물론 사용하지 않고도 만들 수 있다. 하지만 Syntax Error 를 경험하게 될것이다.)

기본적인 문법은 다음과 같다.

/**
 * 1.권장하는 방법..
 **/
var regExp = new RegExp(pattern,modifiers);

//또는.
/**
 * 2.같은 정규식을 만들더라도..Syntax Error가 많이 발생하는 것을 경험했다.
 **/
var regExp = /pattern/modifiers;


1번방법을 이용하여, 주석을 제거하는 정규식을 만들어 보겠다.("//" 에 해당하는 주석만 삭제된다.)



/**
 * "//"로 시작하고, "\n"(줄바꿈)으로 끝나는 글자(문장?)를 찾는다. 
 * modifier로 gm 을 지정. g 는 global(전체검색), m은 multiline(여러줄 찾기)
 */
var regExp = new RegExp("//.*\n", "gm");
/**
 * 그리고 제거하고자 하는 String value의 replace를 사용하면된다.
 * trim은 양 끝의 공백, 줄바꿈 등을 제거하기 위해 사용.
 * str은 임의의 문자.
 */
str = str.replace(regExp, "").trim()

위의 코드대로 검색하면, "//"에 해당하는 주석은 모두 제거된다.

"/* */"도 제거하는 코드는 다음에....업데이트.,,

이 댓글을 비밀 댓글로