Android 使用Google文本转换语音在阅读时突出显示文本
在谷歌阅读文本时,我面临着突出显示文本的问题。每台设备都有自己的阅读速度,因此突出显示文本和声音会导致问题,在某些设备中似乎不一致 我试着在谷歌开始阅读时,用渐进式文本视图类突出显示这个句子。在这个类中,我需要定义浮动中的运行任务值,以便启动高亮显示速度。下面是自定义类代码:Android 使用Google文本转换语音在阅读时突出显示文本,android,google-text-to-speech,Android,Google Text To Speech,在谷歌阅读文本时,我面临着突出显示文本的问题。每台设备都有自己的阅读速度,因此突出显示文本和声音会导致问题,在某些设备中似乎不一致 我试着在谷歌开始阅读时,用渐进式文本视图类突出显示这个句子。在这个类中,我需要定义浮动中的运行任务值,以便启动高亮显示速度。下面是自定义类代码: public class ProgressTextView extends AppCompatTextView { private SpannableTask spannableTask; private
public class ProgressTextView extends AppCompatTextView {
private SpannableTask spannableTask;
private ProgressListener progressListener;
private boolean changeColor = false;
public ProgressTextView(Context context) {
super(context);
init(null);
}
public ProgressTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(getContext().obtainStyledAttributes(attrs, R.styleable.ProgressTextView));
}
public ProgressTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(getContext().obtainStyledAttributes(attrs, R.styleable.ProgressTextView, defStyleAttr, 0));
}
private void init(@Nullable TypedArray typedArray) {
this.spannableTask = new SpannableTask(this, getText().toString());
this.spannableTask.setDefaultTextColor(this.getTextColors().getDefaultColor());
int textColor = typedArray.getColor(R.styleable.ProgressTextView_highlightTextColor, 0);
if (textColor != 0) {
this.spannableTask.setHighlightTextColor(textColor);
}
}
public void addProgressListener(ProgressListener progressListener) {
this.progressListener = progressListener;
}
public SpannableTask getSpannableTask() {
return this.spannableTask;
}
public SpannableTask getSpannableTask(String text) {
this.spannableTask = new SpannableTask(this, text);
this.spannableTask.setHighlightTextColor(getResources().getColor(R.color.yellow));
this.spannableTask.setHighlightBackgroundTextColor(getResources().getColor(R.color.black));
this.spannableTask.setDefaultTextColor(getResources().getColor(R.color.text_color));
return this.spannableTask;
}
public class SpannableTask implements Runnable {
private Handler handler = new Handler();
private SpannableString spannableString;
private String text;
private ProgressTextView spannableTextView;
private int second;
private int defaultTextColor = R.color.text_color;
private int highlightTextColor = Color.YELLOW;
private int backgroundTextColor = Color.BLACK;
public SpannableTask(ProgressTextView spannableTextView, String text) {
this.text = text;
this.spannableString = new SpannableString(text);
this.spannableTextView = spannableTextView;
initTextView(defaultTextColor,backgroundTextColor, text.length());
}
public void runTask(float second) {
this.second = ((int) (second * 1000) / text.length());
new Thread(this).run();
}
public void runTask(int second) {
this.second = second / text.length();
new Thread(this).run();
}
@Override
public void run() {
for (int i = 0; i <= text.length(); i++) {
final int value = i;
handler.postDelayed(new Runnable() {
@Override
public void run() {
changeColor = true;
initTextView(highlightTextColor,backgroundTextColor, value);
if (value == text.length() && progressListener != null) {
cancel();
progressListener.complete();
}
}
}, second * i);
}
}
private void initTextView(int color,int backgroundcolor, int length) {
if(!changeColor){
this.spannableString.setSpan(new BackgroundColorSpan(Color.WHITE), 0, length, 0);
this.spannableString.setSpan( new ForegroundColorSpan(getResources().getColor(R.color.text_color)), 0,length, 0);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append(spannableString);
this.spannableTextView.setText(spannableString);
}else{
this.spannableString.setSpan(new BackgroundColorSpan(color), 0, length, 0);
this.spannableString.setSpan( new ForegroundColorSpan(backgroundcolor), 0,length, 0);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append(spannableString);
this.spannableTextView.setText(spannableString);
}
}
public void cancel() {
changeColor =false;
initTextView(defaultTextColor,backgroundTextColor, text.length());
handler.removeCallbacksAndMessages(null);
}
public void setDefaultTextColor(int defaultTextColor) {
this.defaultTextColor = defaultTextColor;
initTextView(defaultTextColor,backgroundTextColor, text.length());
}
public void setHighlightTextColor(int highlightTextColor) {
this.highlightTextColor = highlightTextColor;
}
public void setHighlightBackgroundTextColor(int backgroundTextColor) {
this.backgroundTextColor = backgroundTextColor;
}
}
}
公共类ProgressTextView扩展了AppCompatTextView{
私人SpannableTask SpannableTask;
私有进程侦听器进程侦听器;
私有布尔changeColor=false;
公共ProgressTextView(上下文){
超级(上下文);
初始化(空);
}
public ProgressTextView(上下文上下文,@Nullable AttributeSet attrs){
超级(上下文,attrs);
init(getContext().obtainStyledAttributes(attrs,R.styleable.ProgressTextView));
}
public ProgressTextView(上下文上下文,@Nullable AttributeSet attrs,int-defStyleAttr){
super(上下文、attrs、defStyleAttr);
init(getContext().obtainStyledAttributes(attrs,R.styleable.ProgressTextView,defStyleAttr,0));
}
私有void init(@Nullable-TypedArray-TypedArray){
this.spannableTask=新的spannableTask(this,getText().toString());
this.spannableTask.setDefaultTextColor(this.getTextColor().getDefaultColor());
int textColor=typedArray.getColor(R.styleable.ProgressTextView\u highlightTextColor,0);
如果(textColor!=0){
此.spannableTask.setHighlightTextColor(textColor);
}
}
public void addProgressListener(ProgressListener ProgressListener){
this.progressListener=progressListener;
}
公共SpannableTask getSpannableTask(){
返回此。spannableTask;
}
公共SpannableTask getSpannableTask(字符串文本){
this.spannableTask=新的spannableTask(this,text);
这个.spannableTask.setHighlightTextColor(getResources().getColor(R.color.yellow));
setHighlightBackgroundTextColor(getResources().getColor(R.color.black));
这个.spannableTask.setDefaultTextColor(getResources().getColor(R.color.text_color));
返回此。spannableTask;
}
公共类SpannableTask实现可运行{
私有处理程序=新处理程序();
私人斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘-斯潘;
私有字符串文本;
private ProgressTextView spannableTextView;
二等兵;
private int defaultTextColor=R.color.text\u color;
private int highlightTextColor=Color.YELLOW;
private int backgroundTextColor=Color.BLACK;
公共SpannableTask(ProgressTextView spannableTextView,字符串文本){
this.text=文本;
this.spannableString=新的spannableString(文本);
this.spannableTextView=spannableTextView;
initTextView(defaultTextColor,backgroundTextColor,text.length());
}
公共无效运行任务(浮点秒){
this.second=((int)(second*1000)/text.length());
新线程(this.run();
}
公共无效运行任务(整数秒){
this.second=second/text.length();
新线程(this.run();
}
@凌驾
公开募捐{
for(int i=0;i=Build.VERSION\u code.LOLLIPOP){
参数put(TextToSpeech.Engine.KEY_PARAM_outrance_ID,mTxtAddress.getText().toString());
textToSpeech.speak(mTxtAddress.getText().toString(),textToSpeech.QUEUE_ADD,params);
}否则{
参数put(TextToSpeech.Engine.KEY_PARAM_outrance_ID,mTxtAddress.getText().toString());
textToSpeech.speak(mTxtAddress.getText().toString(),textToSpeech.QUEUE_ADD,params);
}
}
这有帮助吗?这有帮助吗?
private ProgressTextView.SpannableTask target = null;
private boolean isSpeech=false;
TextToSpeech textToSpeech;
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_voice);
new RetrieveFeedTask().execute("");
}
public static class RetrieveFeedTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
String apiUrl= "https://maps.googleapis.com/maps/api/geocode/json?latlng="+mCurrentLocation.getLatitude()+","+mCurrentLocation.getLongitude()+"&key=YOUR KEY";
URL url = new URL(apiUrl);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
bufferedReader.close();
return stringBuilder.toString();
}
finally{
urlConnection.disconnect();
}
}
catch(Exception e) {
return null;
}
}
protected void onPreExecute() {
}
protected void onPostExecute(String response) {
if(response != null) {
try {
AddressList addressList=new Gson().fromJson(response,AddressList.class);
List<Results> mList= addressList.getResults();
List<AddressComponent> mAddressList= mList.get(0).getAddressComponents();
StringBuilder sb = new StringBuilder();
for (AddressComponent addressComponent:mAddressList) {
if(addressComponent.getTypes().contains("street_number")){
sb.append(addressComponent.getShortName()).append(" ");
}
else if(addressComponent.getTypes().contains("route")){
sb.append(addressComponent.getShortName()).append(", ");
}
else if(addressComponent.getTypes().contains("locality")){
sb.append(addressComponent.getShortName()).append(", ");
}
else if(addressComponent.getTypes().contains("administrative_area_level_1")){
sb.append(addressComponent.getLongName());
}
}
mTxtAddress.setText(sb.toString());
textSpeech();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private void textSpeech(){
textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int result = textToSpeech.setLanguage(Locale.ENGLISH);
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(getApplicationContext(), "This language is not supported!",
Toast.LENGTH_SHORT);
} else {
textToSpeech.setOnUtteranceCompletedListener(VoiceActivity.this);
textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String s) {
final String keyword = s;
runOnUiThread(new Runnable() {
@Override
public void run() {
if(mTxtAddress.getText().toString().equalsIgnoreCase(keyword)){
target = mTxtAddress.getSpannableTask(mTxtAddress.getText().toString());
target.runTask(3.5f);
}
}
});
}
@Override
public void onDone(final String keyword) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(mTxtAddress.getText().toString().equalsIgnoreCase(keyword)){
target.cancel();
}
}
});
}
@Override
public void onError(String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Error ", Toast.LENGTH_SHORT).show();
}
});
}
});
speak();
}
}
}
});
}
private void speak() {
mPlayer.stop();
isSpeech=true;
String text = mTxtEmer.getText().toString();
HashMap<String, String> params = new HashMap<String, String>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,text);
textToSpeech.speak(text, TextToSpeech.QUEUE_ADD, params);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, mTxtAddress.getText().toString());
textToSpeech.speak(mTxtAddress.getText().toString(), TextToSpeech.QUEUE_ADD, params);
} else {
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, mTxtAddress.getText().toString());
textToSpeech.speak(mTxtAddress.getText().toString(), TextToSpeech.QUEUE_ADD, params);
}
}