我试图根据我从url的Json数据获得的Rgb值绘制渐变
我从AsyncTask获取数据,然后尝试使用该rgb
进行绘制我只是制作一个全局变量来实现它
帮助!
package kr.co.company.gradienttest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader.TileMode;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
class MyView extends View {
String feeling = "a";
int rgb_r = 0;
int rgb_g = 0;
int rgb_b = 0;
int[] colors = { Color.WHITE, Color.BLUE, Color.RED };
public String getJsonText() {
// 내부적으로 문자열 편집이 가능한 StringBuffer 생성자
String line2 = null;
try {
String simpleUrl = "http://www.ibtk.kr/ehcdCbEColor/9141c5bbd85536b91342504e6e23c049?model_query_pageable.pageSize=200&model_query_fields=%7B%27cbaAlikeWord%27:1,%27cbaR1%27:1,%27cbaG1%27:1,%27cbaB1%27:1,%27_id%27:0%7D";
String line = getStringFromUrl(simpleUrl);
line2 = line;
// 원격에서 읽어온 데이터로 JSON 객체 생성
} catch (Exception e) {
e.printStackTrace();
}
return line2;
} // getJsonText
// getStringFromUrl : 주어진 URL 페이지를 문자열로 얻는다.
public String getStringFromUrl(String url)
throws UnsupportedEncodingException {
// 입력스트림을 "UTF-8" 를 사용해서 읽은 후, 라인 단위로 데이터를 읽을 수 있는 BufferedReader 를
// 생성한다.
BufferedReader br = new BufferedReader(new InputStreamReader(
getInputStreamFromUrl(url), "UTF-8"));
// 읽은 데이터를 저장한 StringBuffer 를 생성한다.
StringBuffer sb = new StringBuffer();
try {
// 라인 단위로 읽은 데이터를 임시 저장한 문자열 변수 line
String line = null;
// 라인 단위로 데이터를 읽어서 StringBuffer 에 저장한다.
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
} // getStringFromUrl
// getInputStreamFromUrl : 주어진 URL 에 대한 입력 스트림(InputStream)을 얻는다.
public static InputStream getInputStreamFromUrl(String url) {
InputStream contentStream = null;
try {
// HttpClient 를 사용해서 주어진 URL에 대한 입력 스트림을 얻는다.
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(new HttpGet(url));
contentStream = response.getEntity().getContent();
} catch (Exception e) {
e.printStackTrace();
}
return contentStream;
} // getInputStreamFromUrl
private class JsonLoadingTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strs) {
return getJsonText();
} // doInBackground : 백그라운드 작업을 진행한다.
@Override
protected void onPostExecute(String result) {
try {
JSONObject object = new JSONObject(result);
// "kkt_list" 배열로 구성 되어있으므로 JSON 배열생성
JSONArray Array = new JSONArray(object.getString("content"));
// for (int i = 0; i < Array.length(); i++) {
// bodylist 배열안에 내부 JSON 이므로 JSON 내부 객체 생성
JSONObject insideObject = Array.getJSONObject(1);
// StringBuffer 메소드 ( append : StringBuffer 인스턴스에 뒤에 덧붙인다. )
// JSONObject 메소드 ( get.String(), getInt(), getBoolean() .. 등 :
// 객체로부터 데이터의 타입에 따라 원하는 데이터를 읽는다. )
// "느낌
feeling = insideObject.getString("cbaAlikeWord");
Log.d("feeling인 jsonget", feeling);
rgb_r = insideObject.getInt("cbaR1");
rgb_g = insideObject.getInt("cbaG1");
rgb_b = insideObject.getInt("cbaB1");
colors[0] = Color.BLUE;
colors[1] = Color.RED;
colors[2] = Color.WHITE;
// } // for
} catch (JSONException e) {
e.printStackTrace();
}
} // onPostExecute : 백그라운드 작업이 끝난 후 UI 작업을 진행한다.
} // JsonLoadingTask
public MyView(Context context) {
super(context);
setBackgroundColor(Color.BLACK);
}
public void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setShader(new LinearGradient(0, 0, 320, 0, colors, null,
TileMode.CLAMP));
canvas.drawRect(0, 210, 300, 260, paint);
canvas.drawText("colors[]", 0, 280, paint);
}
}
public class GradientTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
}
答案 0 :(得分:0)
声明AsyncTask的最后一种类型,在你的情况下是String,你在doInBackground方法中返回一个JSON字符串,你可以用它来返回Integer数组,你可以在0,第1和第2位设置r,g和b数组的索引并返回该数组而不是JSON字符串(在doInBackGround方法中将json解析为r,g和b)。
private class JsonLoadingTask extends AsyncTask<String, Void, int [] >
并且您的doInBackground方法将数组返回为
protected int[] doInBackground(String... strs) {
String jsonString = getJsonText();
JSONObject object = new JSONObject(result);
JSONArray Array = new JSONArray(object.getString("content"));
JSONObject insideObject = Array.getJSONObject(1);
feeling = insideObject.getString("cbaAlikeWord");
int [] rgbArrayTemp = new int [3];
Log.d("feeling jsonget", feeling);
rgbArrayTemp[0] = insideObject.getInt("cbaR1");
rgbArrayTemp[1] = insideObject.getInt("cbaG1");
rgbArrayTemp[2] = insideObject.getInt("cbaB1");
colors[0] = Color.BLUE;
colors[1] = Color.RED;
colors[2] = Color.WHITE;
return rgbArrayTemp;
} // doInBackground
这样你就可以打电话了
int [] rgbArray = new JsonLoadingTask("").execute().get();
rgbArray将包含颜色值。