Android 如何缩放、移动和;放大、缩小文本视图?
我想在我的项目中缩放、移动和放大、缩小文本视图。 是否有任何用于执行此任务的库 参考应用程序文本,我想这样做Android 如何缩放、移动和;放大、缩小文本视图?,android,scale,textview,translate,Android,Scale,Textview,Translate,我想在我的项目中缩放、移动和放大、缩小文本视图。 是否有任何用于执行此任务的库 参考应用程序文本,我想这样做 所有这些都像剪贴画、贴纸等,我只在这样的文本绘图中遇到问题。查看动画是您所需要的。例如,将myanim.xml放入res/anim文件夹中,其中包含以下内容: <set android:shareInterpolator="false"> <scale android:interpolator="@android:anim/accelerate
所有这些都像剪贴画、贴纸等,我只在这样的文本绘图中遇到问题。
查看动画
是您所需要的。例如,将myanim.xml
放入res/anim
文件夹中,其中包含以下内容:
<set android:shareInterpolator="false">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400"
android:fillBefore="false" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400" />
</set>
</set>
阅读更多或。//使用添加zoomview的工具,尝试下面的代码自定义视图
包裹
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Matrix;
导入android.graphics.Paint;
导入android.util.AttributeSet;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.FrameLayout;
/**
*缩放视图。
*/
公共类ZoomView扩展了FrameLayout{
公共ZoomView(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
//TODO自动生成的构造函数存根
}
公共ZoomView(上下文、属性集属性){
超级(上下文,attrs);
//TODO自动生成的构造函数存根
}
公共ZoomView(最终上下文){
超级(上下文);
}
/**
*缩放视图侦听器界面。
*
*@作者卡鲁奥利克
*
*/
公共接口ZoomViewListener{
void onZoomStarted(浮动缩放、浮动缩放、浮动缩放);
无效缩放(浮动缩放、浮动缩放、浮动缩放);
void onzoommended(浮动缩放、浮动缩放、浮动缩放);
}
//缩放
浮动缩放=1.0f;
float maxZoom=2.0f;
浮动平滑缩放=1.0f;
浮动zoomX,缩放;
浮动smoothZoomX、smoothZoomY;
私有布尔滚动;//NOPMD由karooolek于29.06.11 11:45
//小地图变量
私有布尔showMinimap=false;
private int miniMapColor=Color.WHITE;
私有整数最小值=-1;
私有字符串最小化;
私有浮动最小apcaptionSize=10.0f;
private int minimappationcolor=Color.WHITE;
//接触变量
私人长时间;
私人浮动touchStartX,touchStartY;
私人浮动touchLastX,touchLastY;
私人浮动标准;
私有布尔pinching;
私人浮动lastd;
私人浮动lastdx1,lastdy1;
私人浮动lastdx2,lastdy2;
//绘图
私有最终矩阵m=新矩阵();
专用最终油漆p=新油漆();
//听众
ZoomViewListener侦听器;
私家车;
公共浮点getZoom(){
返回缩放;
}
公共浮点getMaxZoom(){
返回最大缩放;
}
公共void setMaxZoom(最终浮点maxZoom){
如果(最大缩放<1.0f){
返回;
}
this.maxZoom=maxZoom;
}
公共void setMiniMapEnabled(最终布尔值showMiniMap){
this.showMinimap=showMinimap;
}
公共布尔值isMiniMapEnabled(){
返回小地图;
}
公共无效设置最小值(最终整数最小值){
如果(最小重量<0){
返回;
}
this.minimaphere=最小重量;
}
public int getminimaphight(){
返回微量计;
}
公共无效设置最小颜色(最终内部颜色){
最小颜色=颜色;
}
public int getminimacpolor(){
返回最小颜色;
}
公共字符串getMiniMapCaption(){
返回最小值;
}
public void setminimacaption(最终字符串minimacaption){
this.minimappation=minimappation;
}
公共浮点getMiniMapCaptionSize(){
返回最小apcaptionsize;
}
公共void setMiniMapCaptionSize(最终浮点大小){
miniMapCaptionSize=大小;
}
public int getminimappationcolor(){
返回最小颜色;
}
公共无效设置MinimapCaptionColor(最终内部颜色){
最小颜色=颜色;
}
公共空心缩放(最终浮动缩放、最终浮动x、最终浮动y){
this.zoom=Math.min(zoom,maxZoom);
zoomX=x;
zoomY=y;
smoothZoomTo(this.zoom,x,y);
}
公共空心smoothZoomTo(最终浮点缩放、最终浮点x、最终浮点y){
平滑缩放=钳制(1.0f,缩放,最大缩放);
smoothZoomX=x;
smoothZoomY=y;
if(侦听器!=null){
onZoomStarted(平滑缩放,x,y);
}
}
公共ZoomViewListener getListener(){
返回侦听器;
}
public void setListner(最终ZoomViewListener侦听器){
this.listener=listener;
}
公共浮点getZoomFocusX(){
返回zoomX*zoom;
}
公共浮点getZoomFocusY(){
返回zoomY*zoom;
}
@凌驾
公共布尔dispatchTouchEvent(最终运动事件ev){
//单触式
if(ev.getPointerCount()==1){
processSingleTouchEvent(ev);
}
////双重接触
if(ev.getPointerCount()==2){
processDoubleTouchEvent(ev);
}
//重画
getRootView().invalidate();
使无效();
返回true;
}
私有void processSingleTouchEvent(最终MotionEvent ev){
最终浮点数x=ev.getX();
最终浮动y=ev.getY();
最终浮动w=最小重量*(浮动)getWidth()/getHeight();
最终浮球h=最小浮球;
最终布尔值touchingMiniMap=x>=10.0f&&x=10.0f&&y 1.0f&&touchingMiniMap){
processSingleTouchOnMinimap(ev);
}否则{
处理单点接触外血脂(ev);
}
}
私有void processSingleTouchOnMinimap(最终运动事件ev){
最终浮点数x=ev.getX();
最终浮动y=ev.getY();
最终浮动w=最小重量*(浮动)getWidth()/getHeight();
最终浮球h=最小浮球;
TextView mText = (TextView) findViewById(R.id.textViewId);
Animation myAnim = AnimationUtils.loadAnimation(this, R.anim.myanim);
mText.startAnimation(myAnim);
//Try below code custom view with having facility to add zoomview
package <your package>;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
/**
* Zooming view.
*/
public class ZoomView extends FrameLayout {
public ZoomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public ZoomView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public ZoomView(final Context context) {
super(context);
}
/**
* Zooming view listener interface.
*
* @author karooolek
*
*/
public interface ZoomViewListener {
void onZoomStarted(float zoom, float zoomx, float zoomy);
void onZooming(float zoom, float zoomx, float zoomy);
void onZoomEnded(float zoom, float zoomx, float zoomy);
}
// zooming
float zoom = 1.0f;
float maxZoom = 2.0f;
float smoothZoom = 1.0f;
float zoomX, zoomY;
float smoothZoomX, smoothZoomY;
private boolean scrolling; // NOPMD by karooolek on 29.06.11 11:45
// minimap variables
private boolean showMinimap = false;
private int miniMapColor = Color.WHITE;
private int miniMapHeight = -1;
private String miniMapCaption;
private float miniMapCaptionSize = 10.0f;
private int miniMapCaptionColor = Color.WHITE;
// touching variables
private long lastTapTime;
private float touchStartX, touchStartY;
private float touchLastX, touchLastY;
private float startd;
private boolean pinching;
private float lastd;
private float lastdx1, lastdy1;
private float lastdx2, lastdy2;
// drawing
private final Matrix m = new Matrix();
private final Paint p = new Paint();
// listener
ZoomViewListener listener;
private Bitmap ch;
public float getZoom() {
return zoom;
}
public float getMaxZoom() {
return maxZoom;
}
public void setMaxZoom(final float maxZoom) {
if (maxZoom < 1.0f) {
return;
}
this.maxZoom = maxZoom;
}
public void setMiniMapEnabled(final boolean showMiniMap) {
this.showMinimap = showMiniMap;
}
public boolean isMiniMapEnabled() {
return showMinimap;
}
public void setMiniMapHeight(final int miniMapHeight) {
if (miniMapHeight < 0) {
return;
}
this.miniMapHeight = miniMapHeight;
}
public int getMiniMapHeight() {
return miniMapHeight;
}
public void setMiniMapColor(final int color) {
miniMapColor = color;
}
public int getMiniMapColor() {
return miniMapColor;
}
public String getMiniMapCaption() {
return miniMapCaption;
}
public void setMiniMapCaption(final String miniMapCaption) {
this.miniMapCaption = miniMapCaption;
}
public float getMiniMapCaptionSize() {
return miniMapCaptionSize;
}
public void setMiniMapCaptionSize(final float size) {
miniMapCaptionSize = size;
}
public int getMiniMapCaptionColor() {
return miniMapCaptionColor;
}
public void setMiniMapCaptionColor(final int color) {
miniMapCaptionColor = color;
}
public void zoomTo(final float zoom, final float x, final float y) {
this.zoom = Math.min(zoom, maxZoom);
zoomX = x;
zoomY = y;
smoothZoomTo(this.zoom, x, y);
}
public void smoothZoomTo(final float zoom, final float x, final float y) {
smoothZoom = clamp(1.0f, zoom, maxZoom);
smoothZoomX = x;
smoothZoomY = y;
if (listener != null) {
listener.onZoomStarted(smoothZoom, x, y);
}
}
public ZoomViewListener getListener() {
return listener;
}
public void setListner(final ZoomViewListener listener) {
this.listener = listener;
}
public float getZoomFocusX() {
return zoomX * zoom;
}
public float getZoomFocusY() {
return zoomY * zoom;
}
@Override
public boolean dispatchTouchEvent(final MotionEvent ev) {
// single touch
if (ev.getPointerCount() == 1) {
processSingleTouchEvent(ev);
}
// // double touch
if (ev.getPointerCount() == 2) {
processDoubleTouchEvent(ev);
}
// redraw
getRootView().invalidate();
invalidate();
return true;
}
private void processSingleTouchEvent(final MotionEvent ev) {
final float x = ev.getX();
final float y = ev.getY();
final float w = miniMapHeight * (float) getWidth() / getHeight();
final float h = miniMapHeight;
final boolean touchingMiniMap = x >= 10.0f && x <= 10.0f + w
&& y >= 10.0f && y <= 10.0f + h;
if (showMinimap && smoothZoom > 1.0f && touchingMiniMap) {
processSingleTouchOnMinimap(ev);
} else {
processSingleTouchOutsideMinimap(ev);
}
}
private void processSingleTouchOnMinimap(final MotionEvent ev) {
final float x = ev.getX();
final float y = ev.getY();
final float w = miniMapHeight * (float) getWidth() / getHeight();
final float h = miniMapHeight;
final float zx = (x - 10.0f) / w * getWidth();
final float zy = (y - 10.0f) / h * getHeight();
smoothZoomTo(smoothZoom, zx, zy);
}
private void processSingleTouchOutsideMinimap(final MotionEvent ev) {
final float x = ev.getX();
final float y = ev.getY();
float lx = x - touchStartX;
float ly = y - touchStartY;
final float l = (float) Math.hypot(lx, ly);
float dx = x - touchLastX;
float dy = y - touchLastY;
touchLastX = x;
touchLastY = y;
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
touchStartX = x;
touchStartY = y;
touchLastX = x;
touchLastY = y;
dx = 0;
dy = 0;
lx = 0;
ly = 0;
scrolling = false;
break;
case MotionEvent.ACTION_MOVE:
if (scrolling || (smoothZoom > 1.0f && l > 30.0f)) {
if (!scrolling) {
scrolling = true;
ev.setAction(MotionEvent.ACTION_CANCEL);
super.dispatchTouchEvent(ev);
}
smoothZoomX -= dx / zoom;
smoothZoomY -= dy / zoom;
return;
}
break;
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_UP:
// tap
if (l < 30.0f) {
// check double tap
if (System.currentTimeMillis() - lastTapTime < 500) {
if (smoothZoom == 1.0f) {
smoothZoomTo(maxZoom, x, y);
} else {
smoothZoomTo(1.0f, getWidth() / 2.0f,
getHeight() / 2.0f);
}
lastTapTime = 0;
ev.setAction(MotionEvent.ACTION_CANCEL);
super.dispatchTouchEvent(ev);
return;
}
lastTapTime = System.currentTimeMillis();
performClick();
}
break;
default:
break;
}
ev.setLocation(zoomX + (x - 0.5f * getWidth()) / zoom, zoomY
+ (y - 0.5f * getHeight()) / zoom);
ev.getX();
ev.getY();
super.dispatchTouchEvent(ev);
}
private void processDoubleTouchEvent(final MotionEvent ev) {
final float x1 = ev.getX(0);
final float dx1 = x1 - lastdx1;
lastdx1 = x1;
final float y1 = ev.getY(0);
final float dy1 = y1 - lastdy1;
lastdy1 = y1;
final float x2 = ev.getX(1);
final float dx2 = x2 - lastdx2;
lastdx2 = x2;
final float y2 = ev.getY(1);
final float dy2 = y2 - lastdy2;
lastdy2 = y2;
// pointers distance
final float d = (float) Math.hypot(x2 - x1, y2 - y1);
final float dd = d - lastd;
lastd = d;
final float ld = Math.abs(d - startd);
Math.atan2(y2 - y1, x2 - x1);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startd = d;
pinching = false;
break;
case MotionEvent.ACTION_MOVE:
if (pinching || ld > 30.0f) {
pinching = true;
final float dxk = 0.5f * (dx1 + dx2);
final float dyk = 0.5f * (dy1 + dy2);
smoothZoomTo(Math.max(1.0f, zoom * d / (d - dd)), zoomX - dxk
/ zoom, zoomY - dyk / zoom);
}
break;
case MotionEvent.ACTION_UP:
default:
pinching = false;
break;
}
ev.setAction(MotionEvent.ACTION_CANCEL);
super.dispatchTouchEvent(ev);
}
private float clamp(final float min, final float value, final float max) {
return Math.max(min, Math.min(value, max));
}
private float lerp(final float a, final float b, final float k) {
return a + (b - a) * k;
}
private float bias(final float a, final float b, final float k) {
return Math.abs(b - a) >= k ? a + k * Math.signum(b - a) : b;
}
@Override
protected void dispatchDraw(final Canvas canvas) {
// do zoom
zoom = lerp(bias(zoom, smoothZoom, 0.05f), smoothZoom, 0.2f);
smoothZoomX = clamp(0.5f * getWidth() / smoothZoom, smoothZoomX,
getWidth() - 0.5f * getWidth() / smoothZoom);
smoothZoomY = clamp(0.5f * getHeight() / smoothZoom, smoothZoomY,
getHeight() - 0.5f * getHeight() / smoothZoom);
zoomX = lerp(bias(zoomX, smoothZoomX, 0.1f), smoothZoomX, 0.35f);
zoomY = lerp(bias(zoomY, smoothZoomY, 0.1f), smoothZoomY, 0.35f);
if (zoom != smoothZoom && listener != null) {
listener.onZooming(zoom, zoomX, zoomY);
}
final boolean animating = Math.abs(zoom - smoothZoom) > 0.0000001f
|| Math.abs(zoomX - smoothZoomX) > 0.0000001f
|| Math.abs(zoomY - smoothZoomY) > 0.0000001f;
// nothing to draw
if (getChildCount() == 0) {
return;
}
// prepare matrix
m.setTranslate(0.5f * getWidth(), 0.5f * getHeight());
m.preScale(zoom, zoom);
m.preTranslate(
-clamp(0.5f * getWidth() / zoom, zoomX, getWidth() - 0.5f
* getWidth() / zoom),
-clamp(0.5f * getHeight() / zoom, zoomY, getHeight() - 0.5f
* getHeight() / zoom));
// get view
final View v = getChildAt(0);
m.preTranslate(v.getLeft(), v.getTop());
// get drawing cache if available
if (animating && ch == null && isAnimationCacheEnabled()) {
v.setDrawingCacheEnabled(true);
ch = v.getDrawingCache();
}
// draw using cache while animating
if (animating && isAnimationCacheEnabled() && ch != null) {
p.setColor(0xffffffff);
canvas.drawBitmap(ch, m, p);
} else { // zoomed or cache unavailable
ch = null;
canvas.save();
canvas.concat(m);
v.draw(canvas);
canvas.restore();
}
// draw minimap
if (showMinimap) {
if (miniMapHeight < 0) {
miniMapHeight = getHeight() / 4;
}
canvas.translate(10.0f, 10.0f);
p.setColor(0x80000000 | 0x00ffffff & miniMapColor);
final float w = miniMapHeight * (float) getWidth() / getHeight();
final float h = miniMapHeight;
canvas.drawRect(0.0f, 0.0f, w, h, p);
if (miniMapCaption != null && miniMapCaption.length() > 0) {
p.setTextSize(miniMapCaptionSize);
p.setColor(miniMapCaptionColor);
p.setAntiAlias(true);
canvas.drawText(miniMapCaption, 10.0f,
10.0f + miniMapCaptionSize, p);
p.setAntiAlias(false);
}
p.setColor(0x80000000 | 0x00ffffff & miniMapColor);
final float dx = w * zoomX / getWidth();
final float dy = h * zoomY / getHeight();
canvas.drawRect(dx - 0.5f * w / zoom, dy - 0.5f * h / zoom, dx
+ 0.5f * w / zoom, dy + 0.5f * h / zoom, p);
canvas.translate(-10.0f, -10.0f);
}
// redraw
// if (animating) {
getRootView().invalidate();
invalidate();
// }
}
}
<com.pkg.pie.ZoomView
android:id="@+id/zoomView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/rlBottomTitle"
android:layout_below="@+id/rlPieTitle"
android:layout_centerInParent="true" >
<RelativeLayout
android:id="@+id/zoomView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/image"
android:layout_width="50sp"
android:layout_height="50sp"
android:clickable="true"
android:src="@drawable/ic_launcher" >
</TextView>
</RealtiveLayout>
</com.pkg.pie.ZoomView>
StickerTextView tv_sticker = new StickerTextView(getContext());
tv_sticker.setText(“call me baby”);
canvas.addView(tv_sticker);