Java 放大/缩小整个页面布局
我正在尝试编写代码来放大/缩小应用程序的整个页面/屏幕。我得到了这个链接 但是对于初学者来说,理解所有要遵循的程序是非常困难的 如果有人能在这个话题上提供帮助和更清晰的解释,我和其他初学者一定会非常感激Java 放大/缩小整个页面布局,java,android,Java,Android,我正在尝试编写代码来放大/缩小应用程序的整个页面/屏幕。我得到了这个链接 但是对于初学者来说,理解所有要遵循的程序是非常困难的 如果有人能在这个话题上提供帮助和更清晰的解释,我和其他初学者一定会非常感激 到目前为止,我已经设置了main活动,应答活动和片段,首先,让我们从简单开始。缩放相对容易。(以下示例中未使用此代码): sx和sy是比例[X/Y] 这就是缩放的基本原理。现在我们来看最难的部分:收缩缩放。这需要用户以触摸事件的形式进行输入 如果无法对根视图使用onTouchEvent,请首先
到目前为止,我已经设置了
main活动
,应答活动
和片段
,首先,让我们从简单开始。缩放相对容易。(以下示例中未使用此代码):
sx
和sy
是比例[X/Y]
这就是缩放的基本原理。现在我们来看最难的部分:收缩缩放。这需要用户以触摸事件的形式进行输入
如果无法对根视图使用onTouchEvent,请首先设置onTouchListener。(我不会展示这部分)
在开始之前,声明一个名为scaleFactor的浮点:
[ANY-ACCESS-MODIFIER] long scaleFactor = 1f;
首先,我们需要一个scalegesturelelistener。如果需要,可以是嵌套类:
class Scaler extends ScaleGestureDetector {
public Scaler(Context context, OnScaleGestureListener listener) {
super(context, listener);
}
@Override
public float getScaleFactor() {//Leave this method empty.
return super.getScaleFactor();
}
}
其次,我们需要OnScale Listener:
class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener{
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleFactor *= detector.getScaleFactor();
if(scaleFactor > 2) scaleFactor = 2;//Limit to your liking
else if(scaleFactor < 0.3f) scaleFactor = 0.3f;//Limit to your liking
scaleFactor = (scaleFactor * 100) / 100;//jitter-protection
//scaleMatrix.setScale(scaleFactor, scaleFactor, detector.getFocusX(), detector.getFocusY());//This is for usage with a Matrix: Good for canvas and other areas where this is usable. This is from my own scaling code, so I keep the matrix around in this example in case it is needed
tv.setScaleX(scaleFactor);
tv.setScaleY(scaleFactor);
tv.setPivotX(detector.getFocusX());
tv.setPivotY(detector.getFocusY());
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {return true;}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {}
}
现在,基本代码已经就位。现在我们需要为s
创建实例:
全球宣布:
private Scaler s;
private ScaleListener listener;
以及在何处对布局进行充气:
listener = new ScaleListener();
s = new Scaler(c, listener);//c is a context.
现在,假设所有组件都已就位,您就有了一个功能正常的放大/缩小系统。请注意,这不包括缩放视图上的滚动。您必须创建一个offsetX/Y变量,并在有一个指针时进行输入,并检查要移动的距离
使用文本视图和触摸事件,您可以使用#setScrollX或#setScrollY以及偏移量来设置新的滚动位置
不过,创建自己的自定义文本视图可能更容易。您可以通过创建一个新类并使其扩展TextView来实现这一点。然后你可以随意修改。这将允许您将缩放等添加到自定义文本视图中。不过,如果您在一个类中有多个文本视图,或者您有多个具有可缩放和可滚动文本视图的活动,那么这是一种首选方法
编辑:自定义文本视图 遗憾的是,并没有多少集成工具可以工作
android:textview上的滚动条对实例不起作用。因此,首先TextView必须有一个滚动视图:
<ScrollView android:id="@+id/textScroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.package.ZoomableTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some hfndusijhgn hgnm hnixjkgbhn fvb uynfv bunfg vbuygn buy hgnyu gnui h uh nuioiogfej uhud\nfhbnikjhgnuieskhg nmuimjhbnguijhgne \nfuyh ghfuisdghbuisjhgnuie dgjh\nifgb dsauingfbehja kbfiuej ksghbisdjkg nbhni\ngfdfjgdfh hdfh sdfhg sh "/>
</ScrollView>
这是为了获得AppCompat库,以便TextView可以使用新功能,同时保持对早期版本的支持。现在来上课:
public class ZoomableTextView extends AppCompatTextView/*This is why the AppCompat dependency is needed*/ {
private float textSize,
textScale;
private Scaler s;
private ScaleListener listener;
public ZoomableTextView(Context context) {
super(context);
init();
}
public ZoomableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ZoomableTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init(){
listener = new ScaleListener();
s = new Scaler(getContext(), listener);
textSize = getTextSize();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
if(ev.getPointerCount() == 2){
s.onTouchEvent(ev);
}
return true;
}
class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener{
@Override
public boolean onScale(ScaleGestureDetector detector) {
textScale *= detector.getScaleFactor();
if(textScale > 2) textScale = 2;//Limit to your liking
else if(textScale < 0.3f) textScale = 0.3f;//Limit to your liking
textScale = (textScale * 100) / 100;//jitter-protection
if(textScale < 0.3f) textScale = 0.3f;
if(textScale > 2) textScale = 2;
setTextSize(textSize * textScale);
setPivotX(detector.getFocusX());
setPivotY(detector.getFocusY());
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {return true;}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {}
}
class Scaler extends ScaleGestureDetector {
public Scaler(Context context, OnScaleGestureListener listener) {
super(context, listener);
}
@Override
public float getScaleFactor() {//Leave this method empty.
return super.getScaleFactor();
}
}
}
public类ZoomableTextView扩展了appcompatitextview/*这就是为什么需要AppCompat依赖项的原因*/{
私有浮动文本大小,
文本尺度;
专用定标器;
专用ScaleListener侦听器;
公共ZoomableTextView(上下文){
超级(上下文);
init();
}
公共ZoomableTextView(上下文、属性集属性){
超级(上下文,attrs);
init();
}
公共ZoomableTextView(上下文上下文、属性集属性、int defStyleAttr){
super(上下文、attrs、defStyleAttr);
init();
}
公共void init(){
侦听器=新的ScaleListener();
s=新的定标器(getContext(),侦听器);
textSize=getTextSize();
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
}
@凌驾
公共事件(MotionEvent ev){
超级火山口(ev);
if(ev.getPointerCount()==2){
s、 火山口(ev);
}
返回true;
}
类ScaleListener实现ScaleGestureDetector.OnScaleGestureListener{
@凌驾
公共布尔标度(scalegestruedetector检测器){
textScale*=检测器.getScaleFactor();
如果(textScale>2)textScale=2;//根据您的喜好限制
否则,如果(textScale<0.3f)textScale=0.3f;//根据您的喜好进行限制
textScale=(textScale*100)/100;//抖动保护
如果(textScale<0.3f)textScale=0.3f;
如果(textScale>2)textScale=2;
setTextSize(textSize*textScale);
setPivotX(detector.getFocusX());
setPivotY(detector.getFocusY());
返回true;
}
@凌驾
公共布尔onScaleBegin(ScaleGetStereDetector检测器){return true;}
@凌驾
标尺上的公共空白(标尺检测器){}
}
类Scaler扩展了ScaleGestureDetector{
公共定标器(上下文,OnScaleGestureListener侦听器){
超级(上下文,听者);
}
@凌驾
public float getScaleFactor(){//将此方法留空。
返回super.getScaleFactor();
}
}
}
谢谢你,马蒂亚斯。我们在处理什么?文本视图?画布?@LunarWatcher。谢谢你在这里。我有片段
和文本视图
和图片。(顺便说一句,你能给我的帖子投上一票吗?我猜人们投下一票主要是为了获得声誉
分数,这有点奇怪)。你想缩放的片段的根视图是什么布局?(布局类型)。而且一个被否决的选民不会因为被否决而获得任何声誉。编辑:根据您提供的链接,我假设您使用RelativeLayout。如果您没有,请留下您使用的注释所有片段都在RelativeLayout中。非常感谢。对我来说,这听起来仍然很复杂。希望你不介意我在这个话题上不断向你寻求更多帮助:)当然,我现在就投票支持你的答案。如果有什么不合意的地方,尽管问,我会回答你的问题。缩放通常是一个很难的话题,因为除了缩放之外,捏和平移的触摸事件也必须加起来。我在回答中给出的代码是我在SurfaceView中使用的,并使用画布。如果出于某种原因,这不起作用,我将帮助您完成创建自己的文本视图的过程,您可以在其中处理zoom insi
<ScrollView android:id="@+id/textScroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.package.ZoomableTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some hfndusijhgn hgnm hnixjkgbhn fvb uynfv bunfg vbuygn buy hgnyu gnui h uh nuioiogfej uhud\nfhbnikjhgnuieskhg nmuimjhbnguijhgne \nfuyh ghfuisdghbuisjhgnuie dgjh\nifgb dsauingfbehja kbfiuej ksghbisdjkg nbhni\ngfdfjgdfh hdfh sdfhg sh "/>
</ScrollView>
compile 'com.android.support:appcompat-v7:25.3.1'
public class ZoomableTextView extends AppCompatTextView/*This is why the AppCompat dependency is needed*/ {
private float textSize,
textScale;
private Scaler s;
private ScaleListener listener;
public ZoomableTextView(Context context) {
super(context);
init();
}
public ZoomableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ZoomableTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init(){
listener = new ScaleListener();
s = new Scaler(getContext(), listener);
textSize = getTextSize();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
if(ev.getPointerCount() == 2){
s.onTouchEvent(ev);
}
return true;
}
class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener{
@Override
public boolean onScale(ScaleGestureDetector detector) {
textScale *= detector.getScaleFactor();
if(textScale > 2) textScale = 2;//Limit to your liking
else if(textScale < 0.3f) textScale = 0.3f;//Limit to your liking
textScale = (textScale * 100) / 100;//jitter-protection
if(textScale < 0.3f) textScale = 0.3f;
if(textScale > 2) textScale = 2;
setTextSize(textSize * textScale);
setPivotX(detector.getFocusX());
setPivotY(detector.getFocusY());
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {return true;}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {}
}
class Scaler extends ScaleGestureDetector {
public Scaler(Context context, OnScaleGestureListener listener) {
super(context, listener);
}
@Override
public float getScaleFactor() {//Leave this method empty.
return super.getScaleFactor();
}
}
}