GVKun编程网logo

android-如何将图像重置为原始位置(android修改imageview的图片)

4

对于android-如何将图像重置为原始位置感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍android修改imageview的图片,并为您提供关于AndroidVolleyLibrary:如

对于android-如何将图像重置为原始位置感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍android修改imageview的图片,并为您提供关于Android Volley Library:如何将图像发送到服务器?、android – 使用软件合成器将MIDI文件转换为原始音频、android – 在Droid X上裁剪图片将结果图像设置为壁纸、android – 如何使应用程序的背景图像重复的有用信息。

本文目录一览:

android-如何将图像重置为原始位置(android修改imageview的图片)

android-如何将图像重置为原始位置(android修改imageview的图片)

我正在使用在https://github.com/MikeOrtiz/TouchImageView可用的TouchImageView类

我使用该类对图片进行放大和缩小,问题出在下一张,

当我更改TouchImageView的图像时,它仍然具有缩放和最后一张图像的位置,而我想要的只是将其重置为初始位置而没有任何缩放

那可能吗?

这是班

package com.example.touch;

import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;

public class TouchImageView extends ImageView {

Matrix matrix;

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 3f;
float[] m;


int viewWidth, viewHeight;
static final int CLICK = 3;
float saveScale = 1f;
protected float origWidth, origHeight;
int oldMeasuredWidth, oldMeasuredHeight;


ScaleGestureDetector mScaleDetector;

Context context;

public TouchImageView(Context context) {
    super(context);
    sharedConstructing(context);
}

public TouchImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    sharedConstructing(context);
}

private void sharedConstructing(Context context) {
    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix = new Matrix();
    m = new float[9];
    setimageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setonTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mScaleDetector.onTouchEvent(event);
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                 last.set(curr);
                    start.set(last);
                    mode = DRAG;
                    break;

                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                        float deltaX = curr.x - last.x;
                        float deltaY = curr.y - last.y;
                        float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale);
                        float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale);
                        matrix.postTranslate(fixTransX, fixTransY);
                        fixTrans();
                        last.set(curr.x, curr.y);
                    }
                    break;

                case MotionEvent.ACTION_UP:
                    mode = NONE;
                    int xDiff = (int) Math.abs(curr.x - start.x);
                    int yDiff = (int) Math.abs(curr.y - start.y);
                    if (xDiff < CLICK && yDiff < CLICK)
                        performClick();
                    break;

                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
            }

            setimageMatrix(matrix);
            invalidate();
            return true; // indicate event was handled
        }

    });
}

public void setMaxZoom(float x) {
    maxScale = x;
}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        mode = ZOOM;
        return true;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float mScaleFactor = detector.getScaleFactor();
        float origScale = saveScale;
        saveScale *= mScaleFactor;
        if (saveScale > maxScale) {
            saveScale = maxScale;
            mScaleFactor = maxScale / origScale;
        } else if (saveScale < minScale) {
            saveScale = minScale;
            mScaleFactor = minScale / origScale;
        }

        if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight)
            matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2, viewHeight / 2);
        else
            matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());

        fixTrans();
        return true;
    }
}

void fixTrans() {
    matrix.getValues(m);
    float transX = m[Matrix.MTRANS_X];
    float transY = m[Matrix.MTRANS_Y];

    float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);
    float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale);

    if (fixTransX != 0 || fixTransY != 0)
        matrix.postTranslate(fixTransX, fixTransY);
}

float getFixTrans(float trans, float viewSize, float contentSize) {
    float minTrans, maxTrans;

    if (contentSize <= viewSize) {
        minTrans = 0;
        maxTrans = viewSize - contentSize;
    } else {
        minTrans = viewSize - contentSize;
        maxTrans = 0;
    }

    if (trans < minTrans)
        return -trans + minTrans;
    if (trans > maxTrans)
        return -trans + maxTrans;
    return 0;
}

float getFixDragTrans(float delta, float viewSize, float contentSize) {
    if (contentSize <= viewSize) {
        return 0;
    }
    return delta;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    viewWidth = MeasureSpec.getSize(widthMeasureSpec);
    viewHeight = MeasureSpec.getSize(heightMeasureSpec);

    //
    // Rescales image on rotation
    //
    if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
            || viewWidth == 0 || viewHeight == 0)
        return;
    oldMeasuredHeight = viewHeight;
    oldMeasuredWidth = viewWidth;

    if (saveScale == 1) {
        //Fit to screen.
        float scale;

        Drawable drawable = getDrawable();
        if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)
            return;
        int bmWidth = drawable.getIntrinsicWidth();
        int bmHeight = drawable.getIntrinsicHeight();

        Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);

        float scaleX = (float) viewWidth / (float) bmWidth;
        float scaleY = (float) viewHeight / (float) bmHeight;
        scale = Math.min(scaleX, scaleY);
        matrix.setScale(scale, scale);

        // Center the image
        float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight);
        float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth);
        redundantYSpace /= (float) 2;
        redundantXSpace /= (float) 2;

        matrix.postTranslate(redundantXSpace, redundantYSpace);

        origWidth = viewWidth - 2 * redundantXSpace;
        origHeight = viewHeight - 2 * redundantYSpace;
        setimageMatrix(matrix);
    }
    fixTrans();
}
 }

解决方法:

解决问题,只需将此功能添加到库中

public void  reiniciarZoom()
{
    matrix = new Matrix(originalMatrix);
    saveScale = 1f;
    setimageMatrix(matrix);
    invalidate();
}

并在每次要将img放置到原始img时调用它

Android Volley Library:如何将图像发送到服务器?

Android Volley Library:如何将图像发送到服务器?

嗨伙计们!

我有一个jpg图像存储在我的设备上,我想将它发送到服务器(mywebsite.com/api.PHP).我想使用排球库,因为它是由谷歌的官方Android开发人员制作的,我认为他们会尽快将它添加到sdk.

现在我正在使用以下代码将字符串发送到服务器:

postRequest = new StringRequest(Request.Method.POST,url,new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        // code here for response
                    } catch (JSONException e) {
                        e.printstacktrace();
                    }
                }
            },new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // code here for error response
                }
            }
    ) {
        @Override
        protected Map<String,String> getParams() {
            Map<String,String> params = new HashMap<>();
            // the POST parameters:
            params.put("key","myApiKey");
            params.put("data","stringOfMyData");
            return params;
        }
    };

如何将jpg发送到具有齐射库的服务器?每次我发送的东西,我需要与API密钥一起发送,以便接收服务器的信息,所以我不能改变Map< String,String>映射< String,File>因为我的API密钥是一个字符串.

我已经读过有一个解决方案可以将我的图像更改为byte []数组,然后将其转换为base64字符串格式,但我希望尽可能避免这种情况.

有没有其他解决方案发送图像而不将其转换为base64字符串?

欢迎任何参考或建议!提前致谢!

解决方法

在POST请求中使用多部分支持发送文件.它与HTML表单中的相同.

Volley默认没有multipart支持,但它很灵活,所以你可以扩展它的Request类来实现你自己的multipart版本.

您可以从此要点中找到MultipartRequest类的一个实现,并在您的程序中使用
https://gist.github.com/ishitcno1/11394069

你可以使用这样的类:

HashMap<String,String> params = new HashMap<String,String>();

    String url = "YOUR POST URL";
    String image_path = "your local image path";

    params.put("your_extra_params","value");

    MultipartRequest multipartRequest =

            new MultipartRequest(url,params,image_path,new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.e(TAG,"Success Response: " + response.toString());

                }
            },new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

                    if (error.networkResponse != null) {
                        Log.e(TAG,"Error Response code: " +
                                error.networkResponse.statusCode);


                        try {



                    }


                    if (error instanceof NetworkError) {
                    } else if (error instanceof ServerError) {
                    } else if (error instanceof AuthFailureError) {
                    } else if (error instanceof ParseError) {
                    } else if (error instanceof NoConnectionError) {
                    } else if (error instanceof TimeoutError) {
                    }
                }
            });

    requestQueue.add(multipartRequest);

android – 使用软件合成器将MIDI文件转换为原始音频

android – 使用软件合成器将MIDI文件转换为原始音频

我正试图直接从我的 Android应用程序动态生成一个小的MP4音频视频文件.

我最初的攻击计划:

>用户输入一些基本的歌曲数据(和弦进行等),应用程序构建一个MIDI文件.
>系统为每个和弦构建和弦图,并使用MIDI阅读器生成动画帧数组,该数组定时到MIDI
>将MIDI转换为原始PCM音频数据< - 此S.O.问题具体到这一点
>将原始音频应用于动画帧 – 并将音频和视频帧编码为MP4
>使用标准播放控件向用户提供生成的MP4视频.

该应用程序已根据用户输入(包括速度,乐器,音符等)构建MIDI文件.此部分很容易完成,MIDI文件正在生成.这款MIDI可以在Android的MediaPlayer中播放. (步骤1)

通过回读MIDI文件并交叉引用序列中每个和弦的静态位图列表,也可以正确创建动画帧.这些帧将成为视频……但最初将没有音频. (第2步)

正如你所看到的,Android MIDI延迟的问题对我来说并不是一个问题,因为我没有创建一个实时合成器应用程序…我只是想将MIDI转换为某种音频格式然后可以混合进入已定时原创MIDI的视频. (第3步)

我遇到的问题是第3步.

我知道我需要使用软件MIDI合成器来获得将从一系列MIDI事件产生的实际音频输出.然而,让它正常工作已成为一个主要障碍.我并不关心所产生音频的精确质量,只是它与人们所期望的相匹配,如果他们使用来自通用设备的通用MIDI样本(ala Gravis soundfonts或bulit-in Sovinox声音等).

所以…

> Android MIDI Lib
> Android Midi Driver using Sonivox EAS Library

我的第一次尝试是上述两个项目……将它们混合起来,以便将MIDI文件转换为原始PCM数据缓冲区….它还没有那么好.

midi库(1)使用实时监听器读取MIDI文件,并将事件发送到Midi Driver(2),Midi Driver(2)播放由板载合成器生成的原始PCM数据.

(注意:对驱动程序进行了一些调整,以便存储整个缓冲区,并且只有在MIDI读取器完成后才返回.这也意味着整个过程花费的时间等于歌曲的长度只是为了转换它因为我们实时“倾听”.)

我还没有像我希望的那样开始工作.我希望保持尽可能简单,并且尽可能使用开源项目.如果它能够在不依赖于实时监听器的情况下做到这一点会更好.

我一直在考虑的其他一些库和工具(但可能有点过分):

> Pure Data Library for Android
> MidiSheetMusic App (with source)
> Synthesis ToolKit in C++ (STK)
> Music Synth for Android
> Crimson SoftSynth

更多的人(还没有做太多的研究):

jfugue /胆怯/大胆/ fluidSynth / csound的/ jMusic / JSyn / Gervill / SOFTONIC /碱/ LibGDX / JetPlayer / OpenSL-ES

我的问题是:

>我是否按照上述项目开辟了正确的道路?我对MIDI-> PCM转换比较陌生,所以我想确保我没有完全错过任何东西.
>如果没有,我应该如何将MIDI文件转换为某种音频格式,然后可以用于创建MP4(或任何视频播放格式)?
>是否有其他开源项目可能有助于使用Android转换MIDI 2原始音频波形的任务?
>是否有任何已经编写过的用于Android的任务示例? (即已经移植用于Android JNI等)

我的希望是,我完全错过了一些会使这项工作变得微不足道的事情……我的假设是,这将需要一些严重的黑客攻击和JNI功夫.

如果这是必要的话,我愿意走艰难的道路.任何和所有的建议将不胜感激.

解决方法

我不是Android用户,但我尝试了很多方法从MIDI生成WAV文件,我对这个任务更加满意,使用FluidSynth,它似​​乎可以作为Android的库使用,并且是另一个StackOverflow问题: Using Fluidsynth to play notes from SoundFonts on Android.

你只需要了解声音字体(搜索网络很容易告诉你)并选择一个不太大的好字体(否则,你可能缺乏内存问题).

同时检查声音字体是否涵盖了您想要播放的所有乐器.

android – 在Droid X上裁剪图片将结果图像设置为壁纸

android – 在Droid X上裁剪图片将结果图像设置为壁纸

在尝试裁剪用户从其库中选择的图像时,我遇到了程序问题.到目前为止这个问题只出现在Droid X上运行时,因为在原始机动车Droid上运行正常.

基本上问题是在运行裁剪意图时发生.一旦用户裁剪了照片并单击了保存按钮,它就会用保存的裁剪图像替换主屏幕上的壁纸!它不会在moto机器人或模拟器上执行此操作.以下是裁剪并将图片保存到SD卡的代码:

@Override
public void onActivityResult(int requestCode,int resultCode,Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (requestCode ==1){
if (resultCode == Activity.RESULT_OK) {
  Intent i = new Intent("com.android.camera.action.CROP");
  i.setData(data.getData());
  i.putExtra("noFaceDetection",true);
  i.putExtra("outputX",80);
  i.putExtra("outputY",80);
  i.putExtra("aspectX",1);
  i.putExtra("aspectY",1);
  i.putExtra("scale",true);


if(selectedImageString == null){
      ContentValues values = new ContentValues();
      values.put(android.provider.MediaStore.Images.Media.TITLE,"Temp_Icon1");
      values.put(android.provider.MediaStore.Images.Media.BUCKET_ID,"Temp_Icons");
      values.put(android.provider.MediaStore.Images.Media.BUCKET_disPLAY_NAME,"Temp_Icons");
      values.put(android.provider.MediaStore.Images.Media.IS_PRIVATE,1);
      selectedImageString = getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values).toString();
  }
  i.putExtra("output",Uri.parse(selectedImageString));
  startActivityForResult(i,2);
}
}
 if(requestCode == 2){
 if (resultCode == Activity.RESULT_OK){
  uriPath = Uri.parse(selectedImageString);
  imageView.setimageURI(uriPath);
 }
}

}

有人可以帮我这个吗?

解决方法

即使使用上面提到的“输出”选项,我也可以验证Droid X是否对我做了同样的事情.到目前为止,我还没有找到解决方法,并且还会考虑阻止Droid X手机的裁剪功能.它很惭愧在这里不起作用.

通过他们的方式,你可以尝试以下……

i.putExtra("return-data",true);

这将返回返回的intent中的图像.您可以通过以下方式访问它…

BitMap BM = data.getParcelableExtra("data");

但是,galaxy S系列手机不支持此功能.无论如何,它都会返回一个空包裹.所以,我还没有找到好的解决方案.

android – 如何使应用程序的背景图像重复

android – 如何使应用程序的背景图像重复

我在我的应用程序中设置了背景图像,但背景图像很小,我想重复它并填写整个屏幕.我该怎么办?

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg"
    android:tileMode="repeat">

解决方法:

好的,这就是我在我的应用程序中得到的内容.它包括一个黑客,以防止ListViews滚动时变黑.

绘制/ app_background.xml:

<?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/actual_pattern_image"
        android:tileMode="repeat" />

价值观/ styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <style name="app_theme" parent="android:Theme">
    <item name="android:windowBackground">@drawable/app_background</item>
    <item name="android:listViewStyle">@style/TransparentListView</item>
    <item name="android:expandableListViewStyle">@style/TransparentExpandableListView</item>
  </style>

  <style name="TransparentListView" parent="@android:style/Widget.ListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
  </style>

  <style name="TransparentExpandableListView" parent="@android:style/Widget.ExpandableListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
  </style>

</resources>

AndroidManifest.xml中:

//
<application android:theme="@style/app_theme">
//

关于android-如何将图像重置为原始位置android修改imageview的图片的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android Volley Library:如何将图像发送到服务器?、android – 使用软件合成器将MIDI文件转换为原始音频、android – 在Droid X上裁剪图片将结果图像设置为壁纸、android – 如何使应用程序的背景图像重复的相关知识,请在本站寻找。

本文标签: