android - 如何在 Android 中选择自定义 TextView?
问题描述
我TextView
在 Android 中有一个自定义,我试图做到这一点“可选择”,但它不起作用。
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e5d8bf"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.deiverbum.app.utils.ZoomTextView
android:id="@+id/tv_Zoomable"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:fontFamily="@font/roboto_regular"
android:textColor="#272626"
android:textIsSelectable="true"
android:textSize="@dimen/default_font" />
</ScrollView>
</RelativeLayout>
我尝试以编程方式做到这一点,但什么也没有......
mTextView.setTextIsSelectable(true);
我尝试在类的构造函数中:
public class ZoomTextView extends android.support.v7.widget.AppCompatTextView implements View.OnTouchListener {
//....
public ZoomTextView(Context context) {
super(context);
this.setTextIsSelectable(true);
}
public ZoomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setTextIsSelectable(true);
}
public ZoomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.setTextIsSelectable(true);
}
// ....
我怎样才能做到这个自定义文本视图可选?
编辑:新的自定义类
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class ZoomTextView extends android.support.v7.widget.AppCompatTextView implements View.OnTouchListener {
final static float STEP = 200;
private static final String TAG = "ZoomTextView";
float mRatio = 13.0f;
int mBaseDist;
float mBaseRatio;
private float zoomLimit = 7.0f;
public ZoomTextView(Context context) {
super(context);
this.setTextIsSelectable(true);
// initialize();
}
public ZoomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setTextIsSelectable(true);
// initialize();
}
public ZoomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.setTextIsSelectable(true);
// initialize();
}
/*
private void initialize() {
defaultSize = getTextSize();
mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener());
}
*/
/***
* @param zoomLimit
* Default value is 3, 3 means text can zoom 3 times the default size
*/
public void setZoomLimit(float zoomLimit) {
this.zoomLimit = zoomLimit;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/*
@Override
public boolean onTouchEvent(@NonNull MotionEvent ev) {
super.onTouchEvent(ev);
mScaleDetector.onTouchEvent(ev);
return true;
}
*/
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
if (event.getPointerCount() == 2) {
int action = event.getAction();
int pureaction = action & MotionEvent.ACTION_MASK;
if (pureaction == MotionEvent.ACTION_POINTER_DOWN) {
mBaseDist = getDistance(event);
mBaseRatio = mRatio;
} else {
float delta = (getDistance(event) - mBaseDist) / STEP;
float multi = (float) Math.pow(2, delta);
mRatio = Math.min(1024.0f, Math.max(0.1f, mBaseRatio * multi));
this.setTextSize(mRatio + 13);
}
}
return true;
}
int getDistance(MotionEvent event) {
int dx = (int) (event.getX(0) - event.getX(1));
int dy = (int) (event.getY(0) - event.getY(1));
return (int) (Math.sqrt(dx * dx + dy * dy));
}
public boolean onTouch(View v, MotionEvent event) {
return false;
}
protected void onDraw (Canvas canvas) {
super.onDraw(canvas);
}
@Override
public void setTextIsSelectable(boolean selectable) {
super.setTextIsSelectable(selectable);
}
@Override
public boolean isTextSelectable() {
return super.isTextSelectable();
}
}
解决方案
为此,您可以覆盖以下方法并在实施活动中使用它。
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context);
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
protected void onDraw (Canvas canvas) {
super.onDraw(canvas);
}
@Override
public void setTextIsSelectable(boolean selectable) {
super.setTextIsSelectable(selectable);
}
@Override
public boolean isTextSelectable() {
return super.isTextSelectable();
}
}
如果您从 Activity 进行更改,这是正确的方法,您可以执行以下操作。
声明部分
CustomTextView customTextView;
在实施部分。
customTextView = findViewById(R.id.customText);
customTextView.setTextIsSelectable(true);
XML 文件将是这样的。
<com.app.yourapp.CustomTextView
android:id="@+id/customText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CUSTOM"/>
推荐阅读
- c# - Serilog 未记录到文件 ASP.Net Core 3.2
- css - Symfony:CreateForm / 为什么我的文本区域没有出现?
- oracle12c - Oracle ADF:计划甘特图非工作日
- java - 静态代码块是否在并发环境中运行多次
- sql - SQL ARRAY:从 my_table 中选择 ID,其中“arrayvalue”=“defined_arrayvalue”
- python - 如何分块解密大文件?
- java - 我们可以从同一个类的其他方法访问setter和getter的数据吗?#JAVA
- c++ - c++ 大写和小写的字符串
- c++ - 如果在 promise.set_value() 之后调用 future.get() 会发生什么?
- arduino - 为什么 Arduino IDE 没有打开?