当前位置:  编程技术>移动开发
本页文章导读:
    ▪2013.11.07 ——— java线程之CLH行列锁        2013.11.07 ——— java线程之CLH队列锁 2013.11.07 ——— java线程之CLH队列锁参考:http://blog.csdn.net/aesop_wubo/article/details/7533186详细解释 见上面的链接,例子如下:package com.lp.lock; public interface Lo.........
    ▪ sencha > 轮播图 数量在contrl 统制        sencha > 轮播图 数量在contrl 控制   countrl   photoListTap: function(list, index, node, record) { if (!this.photoShow) { this.photoShow = Ext.create('Sencha.view.PhotoShow'); } var t_id = list.getS.........
    ▪ 图片的拖拽跟缩放       图片的拖拽和缩放 图片的拖拽很基础也很实用,很多地方用到,直接上干货。MainActivity.java:package com.example.dragzoom; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; im.........

[1]2013.11.07 ——— java线程之CLH行列锁
    来源: 互联网  发布时间: 2014-02-18
2013.11.07 ——— java线程之CLH队列锁
2013.11.07 ——— java线程之CLH队列锁
参考:http://blog.csdn.net/aesop_wubo/article/details/7533186

详细解释 见上面的链接,例子如下:

package com.lp.lock;

public interface Lock {
    void lock();
    void unLock();
}


package com.lp.lock;

public class QNode {
   public volatile boolean locked;
}

package com.lp.lock.clh;

import java.util.concurrent.atomic.AtomicReference;

import com.lp.lock.Lock;
import com.lp.lock.QNode;

public class CLHLock implements Lock{
    AtomicReference<QNode> tail = new AtomicReference<QNode>(new QNode());//
    ThreadLocal<QNode> mPre;//当前线程的前一个qnode
    ThreadLocal<QNode> mNode;//当前线程的当前的qnode
    public CLHLock(){
        tail = new AtomicReference<QNode>(new QNode());
        mNode = new ThreadLocal<QNode>(){
            @Override
            protected QNode initialValue() {
                return new QNode();
            }
        };
        mPre = new ThreadLocal<QNode>(){
            @Override
            protected QNode initialValue() {
                return null;
            }
        };
    }
    /**
     * 
     */
    @Override
    public void lock() {
        QNode lNode = mNode.get();//得到当前线程的qnode
        lNode.locked = true;//设置为true 告诉其他线程 我准备获得锁
        QNode pNode = tail.getAndSet(lNode);//得到前一个获得锁的qnode 并将tail设置我当前qnode,这样下一个线程就会等待本线程释放锁之后 才会执行 形成了队列 己成为队列的尾部
        mPre.set(pNode);
        while(pNode.locked){//等待前一个获得锁的线程释放锁
//            System.out.println(Thread.currentThread().getName());
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            
        }
    }
    @Override
    public void unLock() {
        QNode lNode = mNode.get();//得到当前线程的qnode
        lNode.locked = false;//设置为false 告诉其他线程 我释放了锁
        mNode.set(mPre.get());//移除本节点 
    }
    
    
    
}


package com.lp.lock.clh;


import com.lp.lock.Lock;

public class TestCLHLock {
    public static void main(String[] args) {
        final Kfc kfc = new Kfc();
        for(int i=0;i<10;i++){
            new Thread("eat" + i){
                public void run() {
                    while(true){
                        kfc.eat();
                    }
                }
            }.start();
        }
    }
}

class Kfc{
    private final Lock lock = new CLHLock();
    private int i = 0;
    public void eat(){
        try {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + ": " + --i);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            lock.unLock();
        }
    }
    public void cook(){
        try {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + ": " + ++i);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            lock.unLock();
        }
    }
}




    
[2] sencha > 轮播图 数量在contrl 统制
    来源: 互联网  发布时间: 2014-02-18
sencha > 轮播图 数量在contrl 控制

 

countrl

 

    photoListTap: function(list, index, node, record) {
        if (!this.photoShow) {
            this.photoShow = Ext.create('Sencha.view.PhotoShow');
        }
 		
 		var t_id = list.getStore().getAt(index).get('t_id');
		this.showPhoto(t_id,this.photoShow);
        this.getPhotoCard().push(this.photoShow);
    },
    showPhoto: function(t_id,pt){
		//操作store
		var photoShowST = Ext.getStore('PhotoShowST');	
		photoShowST.getProxy().setExtraParam('t_id', t_id);
		photoShowST.load();
		//\    
		//操作photoView	
		var count = photoShowST.getAt(0).get('photo_count');
		var myitems = [];  
		for(j=0;j<=count;j++){
			myitems.push(  
				{xtype: 'image',src: 'http://www.sencha.com/assets/images/sencha-avatar-64x64.png'}
			); 		
		}		
       pt.setItems(myitems);
    },   

 

view:

Ext.define('Sencha.view.PhotoShow', {
    extend: 'Ext.Carousel',
	xtype: 'photo_show_xx',
    config: 
    {        
  	
		directionLock: true,
		direction: 'horizontal',

    }
});

 


    
[3] 图片的拖拽跟缩放
    来源: 互联网  发布时间: 2014-02-18
图片的拖拽和缩放
图片的拖拽很基础也很实用,很多地方用到,直接上干货。
MainActivity.java:
package com.example.dragzoom;

import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

/**
 * 
 * @author Zls
 *实现图片的拖拽和缩放,给图片添加onClickListener
 */

public class MainActivity extends Activity {

	private ImageView image;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		image = (ImageView) this.findViewById(R.id.image);
		image.setOnTouchListener(new MyTouchListener());
	}

	public final class MyTouchListener implements OnTouchListener {
		private int mode = 0;									//三种模式表示触摸类型
		private static final int DRAG = 1;
		private static final int ZOOM = 2;
		private PointF startpPoint = new PointF(), midPoint;	//startPoint用来记录拖拽的时候记录第一次拖拽的点,midPoint让图片缩放的时候不移动
		private float startDis, endDis;							//两者之比表示缩放比例
		private Matrix oldMatrix = new Matrix(), newMatrix = new Matrix();		//两个矩阵

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			switch (event.getAction() & MotionEvent.ACTION_MASK) {
			case MotionEvent.ACTION_DOWN:						//单手指按下表示为拖拽
				mode = DRAG;
				oldMatrix.set(image.getImageMatrix());
				startpPoint.set(event.getX(), event.getY());
				break;

			case MotionEvent.ACTION_MOVE:						// 手指在屏幕移动,该 事件会不断地触发
				if (mode == DRAG) {
					float dx = event.getX() - startpPoint.x;	// 得到在x轴的移动距离
					float dy = event.getY() - startpPoint.y;	// 得到在y轴的移动距离
					newMatrix.set(oldMatrix);					// 在没有进行移动之前的位置基础上进行移动
					newMatrix.postTranslate(dx, dy);
				} else if (mode == ZOOM) {						// 缩放
					endDis = countDis(event);					// 结束距离
					if (endDis > 10f) {
						float scale = endDis / startDis;		// 得到缩放倍数
						newMatrix.set(oldMatrix);
						newMatrix.postScale(scale, scale, midPoint.x,		//应用缩放
								midPoint.y);
					}
				}
				break;

			case MotionEvent.ACTION_UP:							//单手指或多手指抬起都恢复初始状态
			case MotionEvent.ACTION_POINTER_UP:
				mode = 0;
				break;

			case MotionEvent.ACTION_POINTER_DOWN:				//多手指按下
				mode = ZOOM;
				startDis = countDis(event);
				if (startDis > 10f) {
					midPoint = midPoint(event);
				}
				break;
			}
			image.setImageMatrix(newMatrix);					//让image显示最新的矩阵位置和大小,不执行则以上的触摸事件就无效鸟
			return true;
		}
	}

	private static PointF midPoint(MotionEvent event) {
		float dx = (event.getX(1) + event.getX(0)) / 2;
		float dy = (event.getY(1) + event.getY(0)) / 2;
		return new PointF(dx, dy);
	}

	//
	private static float countDis(MotionEvent event) {
		float a = event.getX(1) - event.getX(0);
		float b = event.getY(1) - event.getY(0);
		float c = (float) Math.sqrt(a * a + b * b);
		return c;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


layout_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView 
        android:id="@+id/image"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="matrix"
        android:src="/blog_article/@drawable/luobing/index.html"/>

</RelativeLayout>


ps:如果有错误希望不吝赐教。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
IT科技资讯 iis7站长之家
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3