⑴ android中我在一個RelativeLayout中放入了一個ImageView,我的Imageview自定義之可以拖動,也就是可以在這
這個問題是給imageView設置了background後會調用它的onLayout函數使得imageView在relativeLayout裡面重新布局引起的。沒什麼特別的辦法,在設置背景之前保存layout的四個參數,設置背景之後再調用一次layout吧~
⑵ android中的imageview怎麼設置上下左右的滑動事件
private float mPosX; private float mPosY; private float mCurrentPosX; private float mCurrentPosY; private ImageView imageview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageview = (ImageView) findViewById(R.id.imageview); imageview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { // 按下 case MotionEvent.ACTION_DOWN: mPosX = event.getX(); mPosY = event.getY(); break; // 移動 case MotionEvent.ACTION_MOVE: mCurrentPosX = event.getX(); mCurrentPosY = event.getY(); if (mCurrentPosX - mPosX > 0 && Math.abs(mCurrentPosY - mPosY) < 10) Log.e("", "向右"); else if (mCurrentPosX - mPosX < 0 && Math.abs(mCurrentPosY - mPosY) < 10) Log.e("", "向左"); else if (mCurrentPosY - mPosY > 0 && Math.abs(mCurrentPosX - mPosX) < 10) Log.e("", "向下"); else if (mCurrentPosY - mPosY < 0 && Math.abs(mCurrentPosX - mPosX) < 10) Log.e("", "向上"); break; // 拿起 case MotionEvent.ACTION_UP: break; default: break; } return true; } }); }
⑶ 在安卓開發中,有兩個可拖動的ImageView控制項,當拖動產生重疊時,詳情在補充里
沒遇到過這種問題 , 試試隱藏A再顯示A 或者獲取到A的位置新建一個ImageView
⑷ 關於android中將imageview通過手勢進行上下移動的問題
跪求加好友!!晚上一起研究!!qq1009186231
⑸ andriod開發,我在layout中拖入了一個ImageView,怎麼直接在定義裡面控制它的大小
這個你可以把iamgeview放到一個絕對布局裡面,定義該布局的大小,然後讓imageview的大小直接這樣設置:android:layout_width="wrap_content"
android:layout_height="wrap_content"
⑹ android的draglistview怎麼嬙獻旰蟮膗i
一些應用在拖動一個列表項時會浮現一個小圖片用於代表當前拖動的列表項
核心代碼如下。
//自定義ListView,准備改造成自己想要的ListView
//這樣的好處是我們不僅可以直接使用ListView很多現成的穩定的方法,而且可以重寫方法改寫ListView的行為(利用的是java面向對象的繼承特性,本人喜歡在任何代碼中分析面向對象的特性、原則和模式)
public class DragListView extends ListView {
private static final String TAG = DragListView.class.getSimpleName();
/**
* 被拖拽項的影像,其實就是一個ImageView
* */
private ImageView dragImageView;
private int dragPointX;//手指拖動的位置坐標
private int dragPointY;
private int dragOffsetX;//拖動影像與手指拖動位置的偏移
private int dragOffsetY;
private int dragDownX;//手指開始拖拽的起始點x坐標
private WindowManager windowManager;// windows窗口控制類
private WindowManager.LayoutParams windowParams;// 用於控制拖拽項的顯示的參數
private DragListener mDragListener;
public DragListView(Context context, AttributeSet attrs) {
super(context, attrs);
setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView parent, View v,
int position, long id) {
Log.e(TAG, "onItemLongClick");
// 設置Drawingcache為true,獲得選中項的影像bm,就是後面我們拖動的哪個頭像
v.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(v.getDrawingCache());
startDrag(bm);
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// 捕獲down事件
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
int x = (int) ev.getX();
int y = (int) ev.getY();
// 如果是無效位置(超出邊界,分割線等位置),返回
if (getCount() < 1) {
return super.onInterceptTouchEvent(ev);
}
if (mDragListener != null) {
mDragListener.down(x, y);
}
ViewGroup itemView = (ViewGroup) getChildAt(0);
if (itemView != null) {
dragPointY = (int) (ev.getRawY() - (itemView.getHeight() / 2));
dragOffsetY = (itemView.getHeight() / 2);
dragOffsetX = (int) (itemView.getWidth() / 2);
dragPointX = x + dragOffsetX;
dragDownX = x;
}
return false;
}
return super.onInterceptTouchEvent(ev);
}
/**
*
* 准備拖動,初始化拖動項的圖像
*
* @param bm
*
* @param y
*/
public void startDrag(Bitmap bm) {
// 釋放影像,在准備影像的時候,防止影像沒釋放,每次都執行一下
stopDrag();
windowParams = new WindowManager.LayoutParams();
// 從上到下計算y方向上的相對位置,
windowParams.gravity = Gravity.TOP | Gravity.LEFT;
windowParams.x = dragPointX;
windowParams.y = dragPointY;
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
LogEx.i(TAG, "x:-->" + windowParams.x + " y: " + windowParams.y);
// 下面這些參數能夠幫助准確定位到選中項點擊位置,照抄即可
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;
// 把影像ImagView添加到當前視圖中
ImageView imageView = new ImageView(getContext());
imageView.setImageBitmap(bm);
windowManager = (WindowManager) getContext().getSystemService("window");
windowManager.addView(imageView, windowParams);
// 把影像ImageView引用到變數drawImageView,用於後續操作(拖動,釋放等等)
dragImageView = imageView;
}
/**
*
* 停止拖動,去除拖動項的頭像
*/
public void stopDrag() {
if (dragImageView != null) {
dragPointX = 0;
dragOffsetX = 0;
windowManager.removeView(dragImageView);
dragImageView = null;
}
}
過客/ty 20:41:41
/**
*
* 觸摸事件
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
// LogEx.v(TAG, "x: " + ev.getX() + " y: " + ev.getY());
// 如果dragmageView為空,說明攔截事件中已經判定僅僅是點擊,不是拖動,返回
// 如果點擊的是無效位置,返回,需要重新判斷
if (dragImageView != null) {
int action = ev.getAction();
int moveY = (int) ev.getY();
int moveX = (int) ev.getX();
switch (action) {
case MotionEvent.ACTION_UP:
// 釋放拖動影像
stopDrag();
// 放下後,判斷位置,實現相應的位置刪除和插入
onDrop(moveX, moveY);
break;
case MotionEvent.ACTION_MOVE:
dragPointY = (int) ev.getRawY() - dragOffsetY;
dragPointX = (int) moveX + dragOffsetX;
// 拖動影像
onDrag(moveY, moveX);
break;
default:
break;
}
return true;
}
// 這個返回值能夠實現selected的選中效果,如果返回true則無選中效果
return super.onTouchEvent(ev);
}
/**
*
* 拖動執行,在Move方法中執行
*
* @param y
*/
public void onDrag(int moveY, int moveX) {
if (dragImageView != null) {
windowParams.alpha = 0.8f;
windowParams.y = dragPointY;
windowParams.x = dragPointX;
windowManager.updateViewLayout(dragImageView, windowParams);
}
if (mDragListener != null) {
mDragListener.move(dragPointX, moveY);
}
}
/**
*
* 拖動放下的時候
*
* @param y
*/
public void onDrop(int x, int y) {
if (mDragListener != null) {
if (x < dragDownX - 30) {
mDragListener.drop(dragPointX, y);
} else {
mDragListener.removeBg();
}
}
}
public void setPointView(DragListener dragListener) {
this.mDragListener = dragListener;
}
public interface DragListener {
void down(int x, int y);
void drop(int x, int y);
void move(int x, int y);
void removeBg();
}
}
⑺ Android ImageView啟動TranslateAnimation之後,如何得到移動過程中的位置。
我也沒學多久,你說的這種情況我認為用Handler、Runnable處理會有效果
///////////////////////////////////////////////////////
你試試下面的代碼,我測試過,可行,xml布局文件就是一個absolutelayout,裡面一個imageview,自己寫
一個注釋都沒有,壞習慣,你自己看吧,呵呵~~~
package com.tianlv.study.temp;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AbsoluteLayout;
import android.widget.ImageView;
public class temp extends Activity {
private Handler mHandler = new Handler();
private Runnable mMoveImage = new Runnable(){
public void run() {
moveImage();
}
};
private ImageView iView;
private int downMouseY;
private AbsoluteLayout.LayoutParams downImagePms;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iView = (ImageView) findViewById(R.id.ImageView01);
iView.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View view, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
Log.i("debug", "stop");
downMouseY = (int) event.getRawY();
downImagePms = (AbsoluteLayout.LayoutParams) iView.getLayoutParams();
mHandler.removeCallbacks(mMoveImage);
}
if(event.getAction() == MotionEvent.ACTION_UP){
Log.i("debug", "move");
mHandler.postDelayed(mMoveImage, 500);
}
if(event.getAction() == MotionEvent.ACTION_MOVE){
dragImage((int) event.getRawY()- downMouseY);
}
return true;
}
});
}
private void moveImage(){
AbsoluteLayout.LayoutParams oldLayPms = (AbsoluteLayout.LayoutParams) iView.getLayoutParams();
AbsoluteLayout.LayoutParams newLayPms = new AbsoluteLayout.LayoutParams(oldLayPms.width, oldLayPms.height, oldLayPms.x, oldLayPms.y+1);
iView.setLayoutParams(newLayPms);
mHandler.removeCallbacks(mMoveImage);
if(newLayPms.y < 300){
mHandler.postDelayed(mMoveImage, 500);
}
}
private void dragImage(int y){
AbsoluteLayout.LayoutParams newLayPms = new AbsoluteLayout.LayoutParams(downImagePms.width, downImagePms.height, downImagePms.x, downImagePms.y+y);
iView.setLayoutParams(newLayPms);
}
}
⑻ android 拖動imageview 如果沒有拖動到指定的位置 返回到起點怎麼實現
點擊imageview,加一個邊框,再點擊,取消邊框。拖動imageview,可以停在移動結束之後的位置上,而不是彈回移動之前的位置。
請問有什麼好的實現辦法。
public class MainActivity extends Activity {
private int screenWidth;
private int screenHeight;
private ImageView bgview;
private ImageView photoview;
private TextView txtview;
int top, right, bottom, left;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels - 50;
bgview = (ImageView) findViewById(R.id.bgview);
photoview = (ImageView) findViewById(R.id.photoview);
photoview.setOnTouchListener(new TouchHandler());
photoview.setOnClickListener(new ClickHandler());
}
class TouchHandler implements OnTouchListener{
int lastX , lastY, dx, dy;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
// if(mode == NONE)
// if(dx < 2 && dy < 2)
{
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
}
break;
case MotionEvent.ACTION_MOVE:
dx = (int) event.getRawX() - lastX;
dy = (int) event.getRawY() - lastY;
// if(mode == DRAG)
{
// photoview.setBackgroundResource(R.drawable.img_border);
left = v.getLeft() + dx;
top = v.getTop() + dy;
right = v.getRight() + dx;
bottom = v.getBottom() + dy;
if(left < 0)
{
left = 0;
right = left + v.getWidth();
}
if(right > screenWidth)
{
right = screenWidth;
left = right - v.getWidth();
}
if(top < 0)
{
top = 0;
bottom = top + v.getHeight();
}
if(bottom > screenHeight)
{
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
}
break;
case MotionEvent.ACTION_UP:
break;
}
if(dx < 2 && dy < 2)
{
return false;
}
return true;
}
}
class ClickHandler implements OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.photoview:
if( null == photoview.getBackground())
{
photoview.setBackgroundResource(R.drawable.img_border);
}else{
photoview.setBackgroundDrawable(null);
}
break;
}
v.layout(left, top, right, bottom);
System.out.println("left===" + left);
System.out.println("top===" + top);
}
}
}